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
来了解我的意思。)-模糊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
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
来了解我的意思。)-模糊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