本文主要是介绍数字图像处理第三版中文版(冈萨雷斯),P71复现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
MATLAB实现比特平面分层(不使用自带bitget函数)
- 数字图像处理第三版中文版(冈萨雷斯),P71复现
- 直接上代码
- 效果图展示
- 比特平面重建
- 实现过程中遇到问题
- 问题图像
- 运行环境:MATLAB R2017b;Windows10
数字图像处理第三版中文版(冈萨雷斯),P71复现
考虑到自己是初学数字图像处理,为了掌握比特平面分层的思想,不是用bitget函数。这里不累述原理。
这里附两个链接:
【1】参考比特平面分成程序。源码有些小问题,会将数值超过判定范围的值都置零了,而如果数值超过判定范围且该位为1的被错误置零。
【2】使用自带bitget函数的代码
直接上代码
clc
clear allImage = imread('Fig0314(a)(100-dollars).tif');%读取图像
subplot(3,3,1)
imshow(Image);
title('原始图像');[M,N] = size(Image);
Temp = double(Image);
BPLImage = zeros(M,N,8);
n = 8;
for k=1:8for i = 1:Mfor j = 1:Nif (Temp(i,j) / 2^(n-1)) >= 1 %判断是否在该比特层中BPLImage(i,j,n) = 1;Temp(i,j) = Temp(i,j) - 2^(n-1);end endendsubplot(3,3,n+1)imshow(uint8(BPLImage(:,:,n)),[]);ind = num2str(n);imti = ['第',ind,'个位平面'];title(imti);n = n-1;
endfigure()
subplot(1,3,1)
ReBPLImage1 = BPLImage(:,:,8) * 128 + BPLImage(:,:,7) * 64 + BPLImage(:,:,6) * 32;
imshow(uint8(ReBPLImage1))
title('比特平面8和7重建')subplot(1,3,2)
ReBPLImage2 = BPLImage(:,:,8) * 128 + BPLImage(:,:,7) * 64 + BPLImage(:,:,6) * 32;
imshow(uint8(ReBPLImage2))
title('比特平面8、7和6重建')subplot(1,3,3)
ReBPLImage3 = BPLImage(:,:,8) * 128 + BPLImage(:,:,7) * 64 + BPLImage(:,:,6) * 32 ...+ BPLImage(:,:,5) * 16;
imshow(uint8(ReBPLImage3))
title('比特平面8、7、6和5重建')
效果图展示
比特平面重建
实现过程中遇到问题
clc
clear allImage = imread('Fig0314(a)(100-dollars).tif');%读取图像
subplot(3,3,1)
imshow(Image);
title('原始图像');[M,N] = size(Image);
Temp = Image;
BPLImage = zeros(M,N,8);
n = 8;
for k=1:8for i = 1:Mfor j = 1:Nif (Temp(i,j) / 2^(n-1)) >= 1 %判断是否在该比特层中BPLImage(i,j,n) = 1;Temp(i,j) = Temp(i,j) - 2^(n-1);end endendsubplot(3,3,n+1)imshow(uint8(BPLImage(:,:,n)),[]);ind = num2str(n);imti = ['第',ind,'个位平面'];title(imti);n = n-1;
end
问题图像
1.就是因为第10行出现少用了一个double,将图像uint8的数据类型转化为可计算的double类型。
运行环境:MATLAB R2017b;Windows10
这篇关于数字图像处理第三版中文版(冈萨雷斯),P71复现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!