我想创建一个图像的直方图,但不考虑第一个k
像素。直方图的图像,但不考虑前k个像素
例如:50x70
图像和k = 40
,直方图是在最后的3460
像素上计算的。图像的第一个40
像素被忽略。 扫描k
像素的顺序是光栅扫描顺序(从左上角开始,按行逐行)。
显然我不能分配一个值,以那些k
像素否则直方图将是不正确。老实说,我不知道如何开始。
我该怎么做? 感谢这么多的方式
我想创建一个图像的直方图,但不考虑第一个k
像素。直方图的图像,但不考虑前k个像素
例如:50x70
图像和k = 40
,直方图是在最后的3460
像素上计算的。图像的第一个40
像素被忽略。 扫描k
像素的顺序是光栅扫描顺序(从左上角开始,按行逐行)。
显然我不能分配一个值,以那些k
像素否则直方图将是不正确。老实说,我不知道如何开始。
我该怎么做? 感谢这么多的方式
矢量化解决方案,您的问题将是
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)
我写
一个可以这样:
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
如果您需要跳过的顶部线条一些确切的数字,那么你可以跳过昂贵条件检查和刚刚开始从外环适当的指数。
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)的发生次数。
你应该解释你的代码或告诉它如何解决这个问题。可能这就是为什么这被标记为低质量。 –
我真的没想过把图像转换成矢量。 因为我想在屏幕上看到生成的图像,我想把结果向量转换成数组'vec2mat(vecWithoutKPixel,width)',其中'width'是原始图像的宽度。 有更好的方法来做到这一点?有可能做到这一点? – beth
@valerie你想看到什么结果图像?没有产生的图像,图像将是相同的。您只是创建了图像的直方图,然后您可以使用“直方图”函数查看该图像。但是你不会改变原始图像上的任何东西。当然,您可以将生成的矢量(直方图)转换为图像宽度的数组,但它不会与图像具有相同的长度,因为直方图具有与图像中颜色一样多的单元格,并且图像数组具有与图像具有像素一样多的单元格。 – Max
或者你想看到没有前k个像素的图像?如果是这样,'k'必须始终是图像所具有的列的倍数。然后,您可以使用'imshow(image((1 + k/size(image,2)):end,:))绘制没有前k个像素的图像' – Max