我想做什么: -
使用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级。
这里有什么问题。请帮忙。
谢谢。
答案 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
对我好看!