对于一幅8比特的图像而言,其灰度级最大值为255(对应二进制数11111111),有8位二进制位,这8个二进制分别对应每一层比特平面的灰度值(最高位对应最高阶比特平面)。因此,只要我们将图像的每一个像素点的灰度级转换为8个二进制位的数字,然后分别提取出每个二进制位数字,按照对应的位置赋值给每一个比特平面对应位置的像素即可。
具体实现步骤如下:
以下是 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
遍历输入的三维比特矩阵 imageBit 的每一个像素点,将所需比特平面的灰度级乘以对应的系数即可,如第8阶比特平面的灰度值乘以2的7(8-1)次方,第7阶比特平面的灰度值乘以2的6次方(7-1)次方,同时对它们进行累加求和即可得到输出图像的灰度级。
具体实现步骤如下:
以下是 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','微软雅黑');