将灰度图像采样为 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
我觉得不错!
我想做什么:-
我正在尝试使用 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
我觉得不错!