您的位置:首页 > 编程语言 > MATLAB

matlab实现 图像的比特平面分层 代码

2018-10-25 21:29 2096 查看

题目:自定义一个用于比特平面分层的函数,给定一副8比特灰度图像(EXP3B.tif和EXP3C.tif),输出该图像第1阶至第8阶比特平面图像。

说明:函数模板为imageBit = myImageBitPlaneSlicing(img);其中,输入参数img为一幅m×n×1的8比特图像;输出参数imageBit为一个3维数组,即imageBit为一个m×n×i (i = 1, 2, …, 8)的矩阵,要求该矩阵的第i个通道上存储第i阶比特平面图像,其中最低阶比特平面为i = 1的比特平面。

 

实现思路:

像素是由比特组成的数字,一幅8比特图像可看为8个1比特图像组成,所以我们可以尝试将图像数据转化为二进制字符串,再来判断每个像素的二进制中的某位是否为1,对此做出相应的处理。

      流程:

      1. 将图像数据转为double类型的,这样比较节省储存空间

    2. 获取图像的高r和宽c

    3. 定义一个8层的 r X c的零矩阵,用于存放最后的结果

    4. 将图像数据转换为8位的二进制字符串,便于判断位于第几比特平面

    5. 将图像的二进制字符串矩阵转化为[r,c,8]的矩阵

    6. 遍历每个像素点,取出矩阵中每个像素点的二进制数,并遍历二进制数的每一位的值,判断是否为1,若为1则赋值为1,否则赋值为0

    7.依次输出每一层的图像

 

实现效果:

 实现源代码:

[code]function imageBit = myImageBitPlaneSlicing(img)
img = double(img);%将图像数据转为double类型的,这样比较节省储存空间
[r,c] = size(img)
imageBit = zeros(r,c,8);%定义一个8层的 r X c的零矩阵

img_bin = dec2bin(img,8);%将图像数据转换为二进制字符串,便于判断位于第几比特平面
[r1,c1] = size(img_bin)%此时矩阵的大小为[r * c,8]

img_bin = reshape(img_bin(:),r,c,c1);%将图像的二进制矩阵转化为[r,c,8]的矩阵
%[r,c,l] = size(img_bin)%此时大小为[r,c,8]
for i = 1 :r
for j = 1:c
temp = img_bin(i,j,:);%取出矩阵中每个像素点的二进制数
for k = 1:8
if isequal(temp(9-k),48)%int('1')=48,判断第k位二进制数是否为'1'
imageBit(i,j,k) = 0;
else
imageBit(i,j,k) = 1;
end
end
end
end
end
[code]clc;
clear;
close all;

img1 = imread('EXP3B.tif');
imageBit1 = myImageBitPlaneSlicing(img1);
figure('name','比特平面分层 EXP3B.tif');
subplot(3,3,1);
imshow(img1);
title('原始图像:EXP3B.tif');
for i = 1:8
subplot(3,3,i + 1);
imshow(imageBit1(:,:,i))
title(['第',num2str(i),'比特平面']);
end

 

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: