【问题标题】:Sampling a Greyscale image into 8 levels将灰度图像采样为 8 个级别
【发布时间】:2015-07-30 01:00:18
【问题描述】:

我想做的事:-

使用 MATLAB,我正在尝试读取灰度图像(像素值范围为 0-255),即 8 位图像到 3 位图像,因此它就像将范围采样到 8 个不同级别。例如,如果像素值为 25,那么当它到达 bw 范围 0-31 时,它将被分配值 0,对于 bw 32-63,级别将为 1,依此类推,直到最终范围 224-255,它将在范围 7 上。

之后我计算不同级别的像素总数。

代码:-

img=imread('Cameraman.bmp');
r=size(img,1);
c=size(img,2);
pixel_count=zeros(9,1);
for i=1:r
    for j=1:c
        if fix(img(i,j)/31)==8
            img(i,j)
        end
        img(i,j)=fix(img(i,j)/33);
        pixel_count(img(i,j)+1)=pixel_count(img(i,j)+1)+1;
    end
end
pixel_count

我的问题:-

即使每个像素的范围是0-255,我将它分为8个级别,我总共得到9个级别。

为了调试它,我在代码中添加了if statement,我的输出是:--

ans = 248
ans = 250
ans = 249
ans = 249
ans = 235
ans = 249
ans = 249
ans = 235
...and more
pixel_count =

   11314
    3741
    2061
    5284
   12629
   25590
    4439
     437
      41

正如您所见,对于 249,235 等一些值,我获得了额外的第 9 级。

这里有什么问题。请帮忙。

谢谢。

【问题讨论】:

  • max(img(:)) 的结果是什么?
  • @zeeMonkeez - 如果是 uint8,那么它应该是 255。任何更大的东西都会饱和,所以没有办法生成超过那么多的值。除此之外,OP 正在除以得到正确的 bin 的错误系数。
  • 确实应该如此。我注意到了错误的系数(它应该是 32),但是 33 它仍然应该只产生 8 个 bin。
  • @zeeMonkeez - 正确的你就是那个!
  • @zeeMonkeez img 就像 2D 矩阵,我得到一整行 256 个值作为输出,没有超过 255 个元素。

标签: image matlab image-processing


【解决方案1】:

您没有正确除以正确的值。您需要除以 32,然后取 floor / fix。在 0-31 之间,如果除以 32,然后取 floor / fix,得到值 0,在 31-63 之间,得到 1,直到 224-255 得到 7。

另外,您的 for 循环不正确。您错误地将输入图像的像素替换为其 bin 位置。我还将精度更改为double。似乎在我的实验中,使用fix 结合uint8 图像给了我你所说的随机第9个bin索引。

看看我的 REPL 中的一些示例结果:

>> fix(240/32) + 1

ans =

     8

>> fix(uint8(240)/32) + 1

ans =

    9

>> fix(uint8(255)/32) + 1

ans =

    9

>> fix(255/32) + 1

ans =

     8

因此,这是图像类型的问题。对于任何超过 240 的值,除以 32 时的值,因为它是 uint8 得到 rounded 以便 240 / 32 = 7.5 但因为它是 uint8 并且它是一个整数,所以它被四舍五入为 8 ,然后加 1 会变为 9。因此,超过 240 的任何值都会四舍五入为 8,并在加 1 时最终得到 9。

所以,只需将除法更改为 32,而不是 33 或 31,然后修复我上面所说的:

img=imread('Cameraman.bmp');
img = double(img); %// Change
r=size(img,1);
c=size(img,2);
pixel_count=zeros(8,1); %// Change
for i=1:r
    for j=1:c
        pix = fix(img(i,j)/32); %// Change here
        pixel_count(pix+1)=pixel_count(pix+1) + 1; %// Change
    end
end
pixel_count

作为一个小提示,要检查您是否正确,请使用histc

pixel_count = histc(fix(double(img(:))/32) + 1, 1:8);

如果你的代码正确,你的代码和我上面写的应该匹配。使用 Image Processing Toolbox 中内置的 cameraman.tif 图像,让我们比较输出:

>> pixel_count
pixel_count =

       13532
        2500
        2104
        8341
       15333
       22553
         817
         356

>> pixel_count2 = histc(fix(double(img(:))/32) + 1, 1:8)

pixel_count2 =

       13532
        2500
        2104
        8341
       15333
       22553
         817
         356

我觉得不错!

【讨论】:

  • 这就是我之前在做的,仍然尝试了一遍,答案没有变化。我仍然得到第 9 级像素数 = 41
  • @Mohit - 你确定?这个对我有用。让我再检查一遍。
  • 抱歉,对上面的评论稍作修改,现在第 9 层的元素数量是 114...
  • @Mohit - 我想通了。这是图像类型的问题。尝试将图像投射double,然后重试。我还编辑了我的帖子。
  • @Mohit - 没问题。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多