gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:32:53 24 4
gpt4 key购买 nike


简而言之,我想找出具有主要颜色的像素的坐标。

具体来说,我想实现以下目标:

  1. 找到主要颜色。我所说的主要是指图像中大多数像素都具有的颜色(我使用直方图实现了它)

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

到目前为止,我只能得到主色。

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

最佳答案

(更新以消除一些弱点)

首先,找到您的主打颜色。你似乎已经知道如何做到这一点,所以我跳过这一步。 (我也没有为此检查或验证您的代码...)

您的代码有一些弱点:

  1. 您只清理 x.txt ,而不是您的 x1.txt

  2. 您应该从第二个命令中删除 | 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 个像素进行平均:-blur 1x65535(此操作使用 3x3方形内核)。在该步骤之后,在生成的图像中,只有那些像素将保持纯黑色,而在原始图像中它们仅被黑色像素包围。

第三,将所有非黑色像素变为白色:通过对图像应用 -fill white +opaque black -fill white -opaque black -operation。 (另请参见 "Morphology" ,尤其是 "Erosion" 。)这通过将所有非黑色颜色变为白色来丢弃图像中的所有其他颜色,并简化您对纯黑色像素的搜索。 (注意:这不适用于这样的 src.png 文件,它们不包含至少一个 3x3 像素区域和纯黑色像素...)

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

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

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

这是并排的 2 张图片:

  • 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 时凭直觉猜测为白色区域“中心”的那个点:

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

现在应该只有非常有限的候选像素符合您的标准。

关于imagemagick 获取具有最常见颜色的像素的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11942398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com