我想做的是:-
使用MATLAB,我试图读取灰度图像(具有像素值bw范围0-255),即8位图像到类似3位图像,因此它就像采样到8个不同的水平。例如,如果像素值为25,那么当出现bw范围0-31时,它将被赋值为0,对于bw 32-63级别将为1,以此类推,直到最终达到范围224-255时,它将处于范围7。
在此之后,我将计数不同级别像素的总no值。
代码:-
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级。
这里有什么问题。请帮帮忙。
谢谢。
发布于 2015-07-29 16:38:44
你没有正确地除以正确的值。您需要除以32,然后取floor / fix。在0-31之间,如果除以32,然后取floor / fix,得到值0,在31-63之间,得到1,直到224-255,得到7。
另外,您的for循环是不正确的。您错误地将输入图像的像素替换为其bin位置。我还会将精度更改为double。在我的实验中,使用fix与uint8图像相结合,可以得到你所说的随机的第9位索引。
看看我的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时的值会得到,因为它是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在我看来不错!
https://stackoverflow.com/questions/31705904
复制相似问题