首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >灰度图像的8级采样

灰度图像的8级采样
EN

Stack Overflow用户
提问于 2015-07-29 16:16:20
回答 1查看 79关注 0票数 0

我想做的是:-

使用MATLAB,我试图读取灰度图像(具有像素值bw范围0-255),即8位图像到类似3位图像,因此它就像采样到8个不同的水平。例如,如果像素值为25,那么当出现bw范围0-31时,它将被赋值为0,对于bw 32-63级别将为1,以此类推,直到最终达到范围224-255时,它将处于范围7。

在此之后,我将计数不同级别像素的总no值。

代码:-

代码语言:javascript
复制
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,输出是:--

代码语言:javascript
复制
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级。

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-29 16:38:44

你没有正确地除以正确的值。您需要除以32,然后取floor / fix。在0-31之间,如果除以32,然后取floor / fix,得到值0,在31-63之间,得到1,直到224-255,得到7。

另外,您的for循环是不正确的。您错误地将输入图像的像素替换为其bin位置。我还会将精度更改为double。在我的实验中,使用fixuint8图像相结合,可以得到你所说的随机的第9位索引。

看看我的REPL的一些示例结果:

代码语言:javascript
复制
>> 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,并修正我前面所说的:

代码语言:javascript
复制
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

代码语言:javascript
复制
pixel_count = histc(fix(double(img(:))/32) + 1, 1:8);

如果您的代码正确,您的代码和我上面所写的应该是匹配的。使用内置到图像处理工具箱的cameraman.tif映像,让我们比较一下输出:

代码语言:javascript
复制
>> 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

在我看来不错!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31705904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档