将灰度图像采样为 8 个级别

Sampling a Greyscale image into 8 levels

我想做什么:-

我正在尝试使用 MATLAB 读取灰度图像(像素值 bw 范围为 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 级。

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

谢谢。

您没有正确地除以正确的值。您需要除以 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 得到 四舍五入 以便 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);

如果你的代码正确,你的代码和我上面写的应该匹配。使用图像处理工具箱内置的 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

我觉得不错!