图像处理 | 比特平面分层以及图像重构
比特平面分层
1、实现思路
对于一幅8比特的图像而言,其灰度级最大值为255(对应二进制数11111111),有8位二进制位,这8个二进制分别对应每一层比特平面的灰度值(最高位对应最高阶比特平面)。因此,只要我们将图像的每一个像素点的灰度级转换为8个二进制位的数字,然后分别提取出每个二进制位数字,按照对应的位置赋值给每一个比特平面对应位置的像素即可。 具体实现步骤如下:
- 获取输入图像的行和列(分别记为r,c),生成一个三维零矩阵 imageBit[r c 8];
- 遍历原图像每一个像素点,将其值转换为8位2进制字符串(调用dec2bin函数),然后提取转型并赋值到对应比特平面(通过一个 i=1-8 的for循环,分别提取出字符串的每一位,然后赋值到对应平面的对应位置即可)。
2、编码实现
以下是 matlab 代码:
function imageBit = myImageBitPlaneSlicing(img) % 用于比特平面分层 % img:一幅m×n×1的8比特图像; % imageBit:一个m×n×i (i = 1, 2, …, 8)的矩阵,第i个通道上存储第i阶比特平面图像 img_double = double(img); [r c] = size(img_double); imageBit = zeros(r,c,8); % 遍历每一个像素点,将其值转换为8位2进制字符串,然后提取转型并赋值到对应比特平面 for row = 1 : r for col = 1 : c % 将灰度级转为8位2进制字符串 bin_str = dec2bin(img_double(row, col),8); for i = 1 : 8 % 提取对应位置的字符,转型后赋值到对应平面的对应位置 digit = str2double(bin_str(i)); imageBit(row,col,9-i) = digit; end end end imageBit = uint8(imageBit);
主函数:
clc; clear all; img = imread(image/EXP3C.tif); % 获得比特平面分层后的图像 imageBit = myImageBitPlaneSlicing(img); [r c k] = size(imageBit); % 画出原图像 subplot(3,3,1); imshow(img); title(原始图像:EXP3C.tif,FontSize,20,FontName,微软雅黑); start = 2; % 分别画出比特平面分层后的图像 for k = 1 : 8 img_temp = imageBit(1:r,1:c,k); subplot(3,3,start); imshow(mat2gray(img_temp)); pic_title = sprintf(第 %d 阶比特平面图像,k); title(pic_title,FontSize,20,FontName,微软雅黑); start = start + 1; end
3、运行结果
图像重构
1、实现思路
遍历输入的三维比特矩阵 imageBit 的每一个像素点,将所需比特平面的灰度级乘以对应的系数即可,如第8阶比特平面的灰度值乘以2的7(8-1)次方,第7阶比特平面的灰度值乘以2的6次方(7-1)次方,同时对它们进行累加求和即可得到输出图像的灰度级。 具体实现步骤如下:
- 获取输入图像的行数和列数,并生成一个相同尺寸的二维数组img2;
- 通过一个 i=1:n 的循环遍历前n个高阶平面,用对应位置的像素值乘以2的(i-1)次方,同时累加求和赋值到输出图像对应位置的像素点。
2、编码实现
以下是 matlab 代码:
function img2 = image_construct(imageBit, n) imageBit_double = double(imageBit); [r c k] = size(imageBit_double); img2 = zeros(r, c); % 遍历每一个像素点,将二进制的灰度级转换为十进制后进行累加 for row = 1 : r for col = 1 : c for i = 1 : n img2(row,col) = img2(row,col) + imageBit(row,col,9-i)*(2^(8-i)); end end end img2 = uint8(img2); end
主函数:
clc; clear all; img = imread(image/EXP3C.tif); subplot(1,3,1); imshow(img); title(原始图像:EXP3C.tif,FontSize,18,FontName,微软雅黑); n = 3; % 获取比特平面分层后的矩阵 imageBit = myImageBitPlaneSlicing(img); % 调用图像重构函数 img2 = image_construct(imageBit, n); subplot(1,3,2); imshow(img2); pic_title = sprintf(利用前%d个高阶比特平面重构的图像,n); title(pic_title,FontSize,18,FontName,微软雅黑); % 图像相减 img_diff = img - img2; subplot(1,3,3); imshow(mat2gray(img_diff)); title(原图像减去重构图像后得到的差值图像,FontSize,18,FontName,微软雅黑);
3、运行结果
上一篇:
IDEA上Java项目控制台中文乱码