降低灰度图像的强度分辨率

时间:2019-02-07 02:34:33

标签: matlab image-processing

我想拍摄一张灰度分辨率为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具有正确的标题。我该如何实现?

2 个答案:

答案 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(:))

由于图像已经很好地填充了范围,因此直方图没有太大变化。但是,请尝试使用您发布的原始图像源,您将明白我的意思:

OP's Lena Version

与我提供的备用Lena版本相比

enter image description here

现在我们已经确定要开始使用明智的图像版本,让我们解决量化步骤问题:主要思想是

  1. 将图像转换为浮动图像并将其标准化为[0,1]间隔
  2. 将其乘以所需的量化步数(例如,第二步为128)
  3. 将值四舍五入并转换回uint8

这样,通过舍入运算将量化步长之间的所有值压缩为一个。

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

lena_quantization

答案 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

要求我降低强度,同时相应调整显示的强度范围。我的内容如下:

Image - Radiology Intensity Levels