【问题标题】:Histogram of an image but without considering the first k pixels图像的直方图,但不考虑前 k 个像素
【发布时间】:2017-07-16 06:02:59
【问题描述】:

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

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

另一个例子是k=3

显然我无法为那些k 像素分配值,否则直方图将不正确。 老实说,我不知道如何开始。

我该怎么做? 非常感谢

【问题讨论】:

    标签: image matlab image-processing histogram


    【解决方案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
    

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

    【讨论】:

    • 不用循环也可以实现。循环很慢。
    • 迭代所有像素很慢。您只能迭代灰度值的数量。
    • @TonyTannous 你不需要任何循环。看我的回答
    • @Max 我今晚晚些时候会检查它。我现在在用手机,这里没有电脑/笔记本电脑。
    【解决方案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
    

    如果你的工作目录中有这个功能,你可以使用

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

    试试看。

    编辑:如果您只需要绘图,您也可以在我编写的函数的第 4 行使用histogram(imageWithoutKPixels)

    【讨论】:

    • 我真的没有想过把图像变成矢量。因为我想在屏幕上看到生成的图像,所以我想将生成的向量转换为数组vec2mat (vecWithoutKPixel, width),其中width 是原始图像的宽度。有更好的方法来做到这一点吗?有可能吗?
    • @valerie 你想看到什么样的结果图像?没有结果图像,图像将是相同的。您只是在创建图像的直方图,然后您可以使用 histogram-function 看到它。但是您不会更改原始图像上的任何内容。您当然可以将结果向量(直方图)转换为图像宽度的数组,但它的长度不会与您的图像相同,因为直方图的单元格与图像的颜色和图像一样多数组的单元数与图像的像素数一样多。
    • 或者你想看没有前k个像素的图像吗?如果是这样,k 必须始终是图像所具有的列的倍数。然后您可以使用imshow(image((1+k/size(image,2)):end,:)) 绘制没有前 k 个像素的图像
    • 哦,你是对的。谢谢,你太客气了!
    【解决方案3】:
    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) 的出现次数。

    【讨论】:

    • 您应该解释您的代码或说明它如何解决问题。可能这就是为什么它被标记为低质量的原因。
    猜你喜欢
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    相关资源
    最近更新 更多