Image 图像的直方图,但不考虑前k个像素

Image 图像的直方图,但不考虑前k个像素,image,matlab,image-processing,histogram,Image,Matlab,Image Processing,Histogram,我想创建图像的直方图,但不考虑第一个k像素 例如:50x70图像和k=40,直方图是根据最后的3460像素计算的。图像的第一个40像素被忽略。 扫描k像素的顺序是光栅扫描顺序(从左上角开始,按行进行) 另一个例子是,其中k=3: 显然,我不能给那些k像素赋值,否则直方图将不正确。 老实说,我不知道如何开始 我该怎么做? 非常感谢方法之一是: histogram = zeros(1,256); skipcount = 0; for i = 1:size(image,1) for j =

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

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

另一个例子是,其中
k=3

显然,我不能给那些
k
像素赋值,否则直方图将不正确。 老实说,我不知道如何开始

我该怎么做?
非常感谢

方法之一是:

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

如果您需要跳过一些精确的顶行数,那么您可以跳过代价高昂的条件检查,只需从适当的索引开始外部循环

方法之一是:

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

如果您需要跳过一些精确的顶行数,那么您可以跳过代价高昂的条件检查,只需从适当的索引开始外部循环

问题的矢量化解决方案是

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
如果您的工作目录中有该函数,则可以使用

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


编辑:如果您只需要绘图,还可以在我编写的函数的第4行中使用
直方图(没有kpixels的图像)
,问题的矢量化解决方案是

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
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
如果您的工作目录中有该函数,则可以使用

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

编辑:如果您只需要绘图,还可以在我编写的函数的第四行使用
直方图(没有kpixels的图像)

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)

前两行删除前k个像素,因此在计算中不考虑它们

然后检查有多少个0并将其保存在数组中。所有灰度级都相同



在hist向量中,在第i个单元格中,您将获得灰度出现次数(i-1)。

无需使用循环即可实现。循环很慢。在所有像素上迭代很慢。您只能迭代灰度值的数量。@TonyTannous您不需要任何循环。看我的answer@Max我今晚晚些时候再查。我现在在我的手机上,这里没有个人电脑/笔记本电脑。不使用环路就可以实现。循环很慢。在所有像素上迭代很慢。您只能迭代灰度值的数量。@TonyTannous您不需要任何循环。看我的answer@Max我今晚晚些时候再查。我现在正在打电话,这里没有个人电脑/笔记本电脑。你应该解释你的代码或告诉它如何解决问题。也许这就是为什么它被标记为低质量。你应该解释你的代码或者告诉它如何解决这个问题。可能这就是为什么它被标记为低质量的原因。我真的没有想过将图像转换成矢量。因为我想在屏幕上看到生成的图像,所以我想将生成的向量转换为数组
vec2mat(vecWithoutKPixel,width)
其中
width
是原始图像的宽度。有更好的办法吗?有可能吗?@valerie你想看到什么样的结果图像?没有结果图像,图像将是相同的。您只需创建图像的直方图,然后可以使用
直方图
-函数查看该直方图。但你不会改变原始图像上的任何内容。当然,您可以将结果向量(直方图)转换为图像宽度的数组,但它的长度与图像的长度不同,因为直方图的单元数与图像的颜色相同,图像数组的单元数与图像的像素数相同。或者,您希望看到没有前k个像素的图像吗?如果是这样,
k
必须始终是图像中列的倍数。然后,您可以使用
imshow(image((1+k/size(image,2)):end,:)
Oh,您说得对。谢谢,你真是太好了!我真的没有想过把图像变成一个向量。因为我想在屏幕上看到生成的图像,所以我想将生成的向量转换为数组
vec2mat(vecWithoutKPixel,width)
其中
width
是原始图像的宽度。有更好的办法吗?有可能吗?@valerie你想看到什么样的结果图像?没有结果图像,图像将是相同的。您只需创建图像的直方图,然后可以使用
直方图
-函数查看该直方图。但你不会改变原始图像上的任何内容。当然,您可以将结果向量(直方图)转换为图像宽度的数组,但它的长度与图像的长度不同,因为直方图的单元数与图像的颜色相同,图像数组的单元数与图像的像素数相同。或者,您希望看到没有前k个像素的图像吗?如果是这样,
k
必须始终是图像中列的倍数。然后,您可以使用
imshow(image((1+k/size(image,2)):end,:)
Oh,您说得对。谢谢,你真是太好了!