在imagemagick中找到最近的水平点?

在imagemagick中找到最近的水平点?,imagemagick,Imagemagick,我试图在这张图中找到离点最近的点(本例中为红色)。在此图像中,此输出从右侧找到第一个线点 我怎么能这么做 输出 请帮帮我。这看起来很有趣!让我们使用ImageMagick将图像转储为文本: convert image.png txt: # ImageMagick pixel enumeration: 337,218,65535,srgb 0,0: (65535,65535,65535) #FFFFFF white 1,0: (65535,65535,65535) #FFFFFF

我试图在这张图中找到离点最近的点(本例中为红色)。在此图像中,此输出从右侧找到第一个线点

我怎么能这么做

输出


请帮帮我。

这看起来很有趣!让我们使用ImageMagick将图像转储为文本:

convert image.png txt: 

# ImageMagick pixel enumeration: 337,218,65535,srgb
0,0: (65535,65535,65535)  #FFFFFF  white
1,0: (65535,65535,65535)  #FFFFFF  white
2,0: (65535,65535,65535)  #FFFFFF  white
3,0: (65535,65535,65535)  #FFFFFF  white
4,0: (65535,65535,65535)  #FFFFFF  white
...
...
221,79: (0,0,0)  #000000  black
221,80: (0,0,0)  #000000  black
221,81: (0,0,0)  #000000  black
221,82: (0,0,0)  #000000  black
...
...
好的,现在让我们使用
awk
查找所有黑色像素并打印它们的(x,y)坐标:

convert image.png txt: | awk -F'[,:]' '/black/{x=$1;y=$2;print x,y}'

221 79
221 80
221 81
221 82
221 83
221 84
...
...
好的,现在让我们通过传入
rx
(红色x坐标)和
ry
(红色y坐标)来告诉
awk
红色像素在哪里。然后,计算从红色到每个黑色像素的x距离和y距离的平方和。当它比迄今为止看到的任何位置都小(即更近)时,请保存该位置。在末尾打印最近的位置

convert image.png txt: | awk -F'[,:]' -v rx=318 -v ry=127 '
   BEGIN{m=999999}
   /black/{
            x=$1; y=$2; d2=(rx-x)*(rx-x)+(ry-y)*(ry-y)
            if(d2<m){m=d2;xm=x;ym=y}
   }
   END{print xm,ym}'

277 127


在重读这个问题时,我注意到你实际上只想要水平最近的点,而我上面的解决方案在任何方向上都适合一般情况。如果只需要水平偏移,并且知道水平线位于y坐标127处,则可以从图像中提取特定行,并简化如下操作:

convert image.png -crop x1+0+127 txt: | awk -F'[,:]' -v rx=318 '
   BEGIN{m=999999} /black/{x=$1;d=(rx-x)*(rx-x);if(d<m){m=d;xm=x}} END{print xm}'
277
compare -metric rmse -subimage-search -dissimilarity-threshold 1 image.png \( -size 1x1 xc:red \) null:

0 (0) @ 317,121

我是如何找到红色像素的坐标的?我使用了ImageMagick的子图像搜索来查找如下红色像素:

convert image.png -crop x1+0+127 txt: | awk -F'[,:]' -v rx=318 '
   BEGIN{m=999999} /black/{x=$1;d=(rx-x)*(rx-x);if(d<m){m=d;xm=x}} END{print xm}'
277
compare -metric rmse -subimage-search -dissimilarity-threshold 1 image.png \( -size 1x1 xc:red \) null:

0 (0) @ 317,121

注释

convert image.png txt: 

# ImageMagick pixel enumeration: 337,218,65535,srgb
0,0: (65535,65535,65535)  #FFFFFF  white
1,0: (65535,65535,65535)  #FFFFFF  white
2,0: (65535,65535,65535)  #FFFFFF  white
3,0: (65535,65535,65535)  #FFFFFF  white
4,0: (65535,65535,65535)  #FFFFFF  white
...
...
221,79: (0,0,0)  #000000  black
221,80: (0,0,0)  #000000  black
221,81: (0,0,0)  #000000  black
221,82: (0,0,0)  #000000  black
...
...
我只是使用了平方和,而不是平方和的平方根,因为它计算速度更快,结果是一样的,因为它认为如果a>b,那么在这种情况下a*a>b*b


我使用的
rx
ry
与子图像搜索生成的稍有不同,因为OP说他有坐标,子图像搜索找到的坐标没有找到相当大的红点的确切中心,而是红点的最左上边缘。

你知道红点的坐标吗?你知道“背景”和“线条”的颜色吗?你需要使用什么编程语言?或者这没关系?Imagemagick不是一个编程工具,它是一个图像处理程序。什么是期望输出?最近直线的x坐标是一个数字?如果你知道表示直线和点坐标的方程式,你只需要一些数学知识。如果你不知道这些方程式,你可以试着从“左”的点逐像素地找到线条,直到你遇到线条颜色的像素。你知道这些线条方程式吗?或者您的输入是位图图像?