imagemagick为最常见颜色的像素获取坐标

imagemagick为最常见颜色的像素获取坐标,imagemagick,Imagemagick,简而言之,我想找出一个主要颜色像素的坐标 convert src.png -format %c histogram:info: > x.txt cat x.txt | awk '{print $1}' | sed 's/://g' > x1.txt h=$(sort -n x1.txt | tail -1) cat x.txt | grep "$h" rm -rf x.txt 具体而言,我希望实现以下目标: 找到主要的颜色。所谓卓越,我指的是图像中大多数像素都具有的颜色(我使用直方


简而言之,我想找出一个主要颜色像素的坐标

convert src.png -format %c histogram:info: > x.txt
cat x.txt | awk '{print $1}' | sed 's/://g' > x1.txt
h=$(sort -n x1.txt | tail -1)
cat x.txt | grep "$h"
rm -rf x.txt
具体而言,我希望实现以下目标:

  • 找到主要的颜色。所谓卓越,我指的是图像中大多数像素都具有的颜色(我使用直方图实现了这一点)

  • 在得到这种颜色(在我的例子中是黑色)之后,我想找到一个黑色的像素,它周围只有黑色像素。基本上,黑色最集中区域的中心

  • 直到现在,我只能得到主要的颜色

    convert src.png -format %c histogram:info: > x.txt
    cat x.txt | awk '{print $1}' | sed 's/://g' > x1.txt
    h=$(sort -n x1.txt | tail -1)
    cat x.txt | grep "$h"
    rm -rf x.txt
    
    结果:

        169211: (  0,  0,  0,255) #000000 black
    
    现在,我还可以得到黑色的所有坐标

    convert src.png txt: | grep black
    469,799: (  0,  0,  0,255)  #000000  black
    470,799: (  0,  0,  0,255)  #000000  black
    471,799: (  0,  0,  0,255)  #000000  black
    472,799: (  0,  0,  0,255)  #000000  black
    473,799: (  0,  0,  0,255)  #000000  black
    474,799: (  0,  0,  0,255)  #000000  black
    475,799: (  0,  0,  0,255)  #000000  black
    476,799: (  0,  0,  0,255)  #000000  black
    477,799: (  0,  0,  0,255)  #000000  black
    478,799: (  0,  0,  0,255)  #000000  black
    ...
    
    但是我需要一个黑色像素的随机坐标,它位于一个只有黑色像素围绕的地方…


    我正在使用Linux和Imagemagick版本6.6.5这只是一种预感,并不是一个完整的答案,但您可以先使用模糊过滤器对图像进行预处理。然后,模糊图像中的黑色像素在原始图像中必须具有黑色邻域


    不过,这对任意颜色都不起作用。

    这只是一种预感,不是一个完整的答案,但你可以先用模糊过滤器对图像进行预处理。然后,模糊图像中的黑色像素在原始图像中必须具有黑色邻域

    不过,这对任意颜色不起作用。

    (更新以消除某些缺点) 首先找到你的主要颜色。你似乎已经知道怎么做了,所以我跳过这一步。(我也没有检查或验证您的代码…)

    您的代码有一些弱点:

  • 您只清理
    x.txt
    ,而不清理
    x1.txt

  • 您应该从第二个命令中删除
    |sed's//://g'
    部分。它从变量中删除了
    冒号,但这可能导致
    h=21
    (而不是
    h=21:
    ),从而导致
    grep“$h”
    查找所有此类行:

     1: (221, 86, 77) #DD564D srgb(221,86,77)
     1: (221,196,192) #DDC4C0 srgb(221,196,192)
     1: (221,203,197) #DDCBC5 srgb(221,203,197)
    [...] 
    21: (255,255,255) #FFFFFF white
    
    如果你把它保持在
    h=21:
    你会找到你要找的那一行!(验证示例:使用内置的
    rose:
    图像代替
    src.png
    来了解我的意思。)

  • ,通过对每个位置的每个像素及其周围8个像素进行平均,对图像应用非常少量的模糊:
    -模糊1x65535
    (此操作使用3x3方形内核)。在该步骤之后,在结果图像中,只有那些像素将保持纯黑色,而在原始图像中,这些像素仅被黑色像素包围

    第三个,使所有非黑色像素变白:通过对图像应用
    -fill white+不透明黑色
    -fill white-不透明黑色
    -操作。(另请参见,特别是…)通过将所有非黑色颜色变为白色,可以清除图像中的所有其他颜色,并简化对纯黑色像素的搜索。(注意:这不适用于不包含至少一个3x3像素区域和纯黑色像素的src.png文件…)

    第四:我们必须考虑图像边界上的像素(这些像素没有8个邻居!),因此我们使用
    -virtual pixel none
    将颜色“none”指定给这些像素

    我将使用ImageMagick内置的名为“徽标”的特殊图片来演示我的方法:

    convert logo: logo.png
    

    正如您很容易看到的,此图像的主色调为白色。(因此,我切换本例的代码,使所有白色像素变为黑色…)

    到目前为止的命令行:

    convert                                                \
       logo:                                               \
      -virtual-pixel none                                  \
       $(for i in {1..2}; do echo " -blur 1x65535 "; done) \
      -fill black                                          \
      -opaque white                                        \
       2_blur-logo-virtpixnone.png
    
    以下是两幅并排的图像:

    • logo.png位于左侧
    • 右侧2_blur-log-virtpixnone.png

    第五步:皮革,冲洗,重复

    现在,让我们应用该算法的更多迭代,如100、500、1000和1300,并对结果应用注释,以便我们知道哪个图像是哪个:

    for j in 100 500 1000 1300; do
       convert                                                       \
          logo:                                                      \
         -virtual-pixel none                                         \
          $(for i in $(seq 1 ${j}); do echo " -blur 1x65535 "; done) \
         -fill black                                                 \
         -opaque white                                               \
         -gravity NorthEast -annotate +10+10 "$j iterations"         \
          ${j}_blur-logo-virtpixnone.png
    done
    
    您可以清楚地看到,我的算法使黑色区域收敛到您在查看原始
    logo.png
    时直观地猜测为白色区域“中心”的点:

    一旦你得到一个没有黑点的输出图像,你就太频繁地重复了一次。返回一次迭代。:-)

    现在,与您的标准匹配的候选像素数量应该非常有限。

    (更新以消除某些缺点) 首先找到你的主要颜色。你似乎已经知道怎么做了,所以我跳过这一步。(我也没有检查或验证您的代码…)

    您的代码有一些弱点:

  • 您只清理
    x.txt
    ,而不清理
    x1.txt

  • 您应该从第二个命令中删除
    |sed's//://g'
    部分。它从变量中删除了
    冒号,但这可能导致
    h=21
    (而不是
    h=21:
    ),从而导致
    grep“$h”
    查找所有此类行:

     1: (221, 86, 77) #DD564D srgb(221,86,77)
     1: (221,196,192) #DDC4C0 srgb(221,196,192)
     1: (221,203,197) #DDCBC5 srgb(221,203,197)
    [...] 
    21: (255,255,255) #FFFFFF white
    
    如果你把它保持在
    h=21:
    你会找到你要找的那一行!(验证示例:使用内置的
    rose:
    图像代替
    src.png
    来了解我的意思。)

  • ,通过对每个位置的每个像素及其周围8个像素进行平均,对图像应用非常少量的模糊:
    -模糊1x65535
    (此操作使用3x3方形内核)。在该步骤之后,在结果图像中,只有那些像素将保持纯黑色,而在原始图像中,这些像素仅被黑色像素包围

    第三个,使所有非黑色像素变白:通过对图像应用
    -fill white+不透明黑色
    -fill white-不透明黑色
    -操作。(另请参见,特别是…)通过使所有非黑色颜色变为白色和s色,可以去除图像中的所有其他颜色
    convert logo: -virtual-pixel none             \
                  -morphology Distance Euclidean  \
                  -auto-level -channel GB         \
                  -threshold 85% 85.png
    
    convert logo: -virtual-pixel none -morphology Distance Euclidean -auto-level -threshold 99% txt:- | grep white
    151,328: (255,255,255,1)  #FFFFFF  white
    152,328: (255,255,255,1)  #FFFFFF  white