2017-02-25 62 views
0

我想创建一个图像的直方图,但不考虑第一个k像素。直方图的图像,但不考虑前k个像素

例如:50x70图像和k = 40,直方图是在最后的3460像素上计算的。图像的第一个40像素被忽略。 扫描k像素的顺序是光栅扫描顺序(从左上角开始,按行逐行)。

另一个例子是这样,在那里k=3enter image description here

显然我不能分配一个值,以那些k像素否则直方图将是不正确。老实说,我不知道如何开始。

我该怎么做? 感谢这么多的方式

回答

2

矢量化解决方案,您的问题将是

function [trimmedHist]=histKtoEnd(image,k) 
imageVec=reshape(image.',[],1);   % Transform the image into a vector. Note that the image has to be transposed in order to achieve the correct order for your counting 
imageWithoutKPixels=imageVec(k+1:end); % Create vector without first k pixels 
trimmedHist=accumarray(imageWithoutKPixels,1); % Create the histogram using accumarray 

如果你有你的workingdirectory该功能你可以使用

image=randi(4,4,4) 
k=6; 
trimmedHistogram=histKtoEnd(image,k) 

尝试。

编辑:如果你只需要剧情,你也可以将功能的第4行中使用histogram(imageWithoutKPixels)我写

+0

我真的没想过把图像转换成矢量。 因为我想在屏幕上看到生成的图像,我想把结果向量转换成数组'vec2mat(vecWithoutKPixel,width)',其中'width'是原始图像的宽度。 有更好的方法来做到这一点?有可能做到这一点? – beth

+1

@valerie你想看到什么结果图像?没有产生的图像,图像将是相同的。您只是创建了图像的直方图,然后您可以使用“直方图”函数查看该图像。但是你不会改变原始图像上的任何东西。当然,您可以将生成的矢量(直方图)转换为图像宽度的数组,但它不会与图像具有相同的长度,因为直方图具有与图像中颜色一样多的单元格,并且图像数组具有与图像具有像素一样多的单元格。 – Max

+1

或者你想看到没有前k个像素的图像?如果是这样,'k'必须始终是图像所具有的列的倍数。然后,您可以使用'imshow(image((1 + k/size(image,2)):end,:))绘制没有前k个像素的图像' – Max

1

一个可以这样:

histogram = zeros(1,256); 
skipcount = 0; 
for i = 1:size(image,1) 
    for j = 1:size(image,2) 
     skipcount = skipcount + 1; 
     if (skipcount > 40) 
      histogram(1,image(i,j)+1) = histogram(1,image(i,j)+1) + 1; 
     end 
    end 
end 

如果您需要跳过的顶部线条一些确切的数字,那么你可以跳过昂贵条件检查和刚刚开始从外环适当的指数。

+0

不使用循环就可以实现。循环很慢。 –

+0

迭代所有像素是缓慢的。您只能迭代灰度值的数量。 –

+0

@TonyTannous你不需要任何循环。看到我的回答 – Max

1
Vec = image(:).'; 
Vec = Vec(k+1:end); 

Hist = zeros(1, 256); 

for i=0:255 
    grayI = (Vec == i); 
    Hist(1, i+1) = sum(grayI(:)); 
end 

前两行挂断第k个像素,使他们不会在计算中考虑。

然后你检查你有多少个0并将它保存在数组中。对于所有灰度级都是一样的。

在hist向量中,在第i个单元格中,将出现灰度级(i-1)的发生次数。

+0

你应该解释你的代码或告诉它如何解决这个问题。可能这就是为什么这被标记为低质量。 –