我想拍摄一张灰度分辨率为2 ^ 8的图像,然后针对k = 7,6,…,2,1迭代将每个图像的强度分辨率降低到2 ^ k。像是将原始图像和强度降低的分辨率图像一起显示在单个图形上。
我已经尝试实现这一点,但是降低强度的分辨率图像与原始图像的显示顺序不正确。每个图像的标题也不会显示。
img = imread('https://i.stack.imgur.com/kP0u2.png');
k = 8
while (k > 0)
reducedImage = uint8((single(img)/256)*2^k);
subplot(3, 3, k);
imshow(reducedImage, [0 255]);
title('Grey-level resolution 2^ %s',k);
k = k - 1;
end
程序应在最左上角显示原始图像,后跟2 ^ k,其中k = 7、6,…,2、1具有正确的标题。我该如何实现?
答案 0 :(得分:2)
我看了您发布的lena图片。您是否真的一直在使用此图像作为开始,或者它已经是您进行颜色压缩的结果?我问是因为图像的直方图肯定看起来没有更多要压缩的东西了。因此,我建议您使用其他图片来源,例如here
img = imread('https://people.sc.fsu.edu/~jburkardt/data/png/lena.png');
然后第一步是确保图像使用uint8的完整动态范围:
min_img = min(img(:));
max_img = max(img(:));
img_norm = (img - min_img) * (256 / double(max_img - min_img));
为了安全起见,让我们看一下图像及其直方图:
figure
subplot(2,2,1)
imshow(img)
subplot(2,2,2)
hist(img(:))
subplot(2,2,3)
imshow(img_norm)
subplot(2,2,4)
hist(img_norm(:))
由于图像已经很好地填充了范围,因此直方图没有太大变化。但是,请尝试使用您发布的原始图像源,您将明白我的意思:
与我提供的备用Lena版本相比
现在我们已经确定要开始使用明智的图像版本,让我们解决量化步骤问题:主要思想是
这样,通过舍入运算将量化步长之间的所有值压缩为一个。
k = 8
figure
while (k > 0)
target_levels = 2^k;
target_compr_factor = 256 / target_levels;
reduced_image = uint8(floor(double(img)/256 * target_levels) * target_compr_factor);
subplot(3, 3, k);
imshow(reduced_image, [0 255]);
title(['Grey-level resolution 2^',num2str(k)]);
k = k - 1;
end
答案 1 :(得分:0)
非常感谢您发布此信息。我能够弄清楚我的任务。
一些评论:
下面的代码行:
reduced_image = uint8(floor(double(img)/256 * target_levels) * target_compr_factor);
对我来说没有意义,因为在我的计算器上打出这个数字,我总是得到256,如果您能详细说明这里发生的事情,我将不胜感激。
最后,我的代码最终看起来像这样
im221=imread('fig221.tif');
figure (3),
k=7;
while (k>0)
intensity_level = 2^k; %calculation of intensity level
current_compression = 256/intensity_level; % this value will be used to set the new range for display
im221_reduced = uint8(floor(double(im221)/intensity_level));
subplot(3, 3, k);
l = current_compression-1;
imshow(im221_reduced, [0,l]);
title(['\fontsize{16}Intensity Level=', num2str(current_compression)]);
k = k-1;
end
要求我降低强度,同时相应调整显示的强度范围。我的内容如下: