快捷搜索: 王者荣耀 脱发

图像处理 | 比特平面分层以及图像重构

比特平面分层

1、实现思路

对于一幅8比特的图像而言,其灰度级最大值为255(对应二进制数11111111),有8位二进制位,这8个二进制分别对应每一层比特平面的灰度值(最高位对应最高阶比特平面)。因此,只要我们将图像的每一个像素点的灰度级转换为8个二进制位的数字,然后分别提取出每个二进制位数字,按照对应的位置赋值给每一个比特平面对应位置的像素即可。 具体实现步骤如下:

  1. 获取输入图像的行和列(分别记为r,c),生成一个三维零矩阵 imageBit[r c 8];
  2. 遍历原图像每一个像素点,将其值转换为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)次方,同时对它们进行累加求和即可得到输出图像的灰度级。 具体实现步骤如下:

  1. 获取输入图像的行数和列数,并生成一个相同尺寸的二维数组img2;
  2. 通过一个 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、运行结果

经验分享 程序员 微信小程序 职场和发展