将灰度图像采样为8级

时间:2015-07-29 16:16:20

标签: image matlab image-processing

我想做什么: -

使用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级。

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

谢谢。

1 个答案:

答案 0 :(得分: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时的值得到舍入以便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

对我好看!