【问题标题】:Reducing the intensity resolution of grey-level image降低灰度图像的强度分辨率
【发布时间】:2019-10-02 05:38:53
【问题描述】:

我想拍摄灰度分辨率为 2^8 的图像,然后迭代以将每个图像的强度分辨率降低到 2^k,对于 k=7, 6, ..., 2, 1。我会喜欢将原始图像与降低强度分辨率的图像一起显示在一个图形上。

我已尝试实现这一点,但是,降低强度分辨率的图像与原始图像的显示顺序不正确。每个图像的标题也不会显示。

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,具有正确的标题。我怎样才能做到这一点?

【问题讨论】:

    标签: matlab image-processing


    【解决方案1】:

    我看了你发布的 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 版本相比

    现在我们已经确保我们有一个合理的图像版本开始,让我们解决量化步骤问题:主要思想是

    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
    

    【讨论】:

      【解决方案2】:

      非常感谢您发布此信息。我能够弄清楚我的任务。

      几个cmets:

      以下代码行:

      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
      

      我被要求降低强度,同时相应地调整显示的强度范围。我的结果如下:

      【讨论】:

        猜你喜欢
        • 2018-12-02
        • 1970-01-01
        • 1970-01-01
        • 2013-11-29
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 2016-02-17
        • 1970-01-01
        相关资源
        最近更新 更多