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

时间:2017-03-06 22:03:05

标签: imagemagick

我正在尝试在此图像中找到距离点最近的点(本例中为红色)。在此图像中,此输出从右侧

找到第一个线点

我该怎么做

enter image description here

输出

enter image description here

请帮帮我。

1 个答案:

答案 0 :(得分:1)

这看起来很有趣!我们使用 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
...
...

好的,现在让我们通过传递awk(红色x坐标)和rx(红色y坐标)告诉ry红色像素的位置。然后,计算从红色到每个黑色像素的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

所以,这就是答案......(277,127)。我们在那里画一个青色圆圈来检查它:

convert image.png -fill cyan -draw "circle 277,127 277,132" check.png

enter image description here

在重新阅读问题时,我注意到你实际上只想要水平最近的点,而我上面的解决方案在任何方向都适合一般情况。如果您只想要水平偏移,并且您知道水平线位于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

如果你不喜欢awk,你可以通过眼球来做...

convert image.png -crop x1+0+127 txt: | grep -E "black|red"

221,0: (0,0,0)  #000000  black
277,0: (0,0,0)  #000000  black         <--- nearest black to red
314,0: (65535,0,0)  #FF0000  red
315,0: (65535,0,0)  #FF0000  red
316,0: (65535,0,0)  #FF0000  red
317,0: (65535,0,0)  #FF0000  red
318,0: (65535,0,0)  #FF0000  red
319,0: (65535,0,0)  #FF0000  red
320,0: (65535,0,0)  #FF0000  red

我是如何找到红色像素的坐标的?我使用 ImageMagick 的子图像搜索来寻找像这样的红色像素:

compare -metric rmse -subimage-search -dissimilarity-threshold 1 image.png \( -size 1x1 xc:red \) null:

0 (0) @ 317,121

备注

我只是使用了正方形之和而不是正方形之和的平方根,因为它在计算上更快并且结果是相同的,因为它认为如果a> b,则a * a&gt; b * b在这种情况下。

我使用了与子图片搜索生成的rxry略有不同的async function(req, res) { try { const user = await userCtrl.getUser(); const userMaps = await mapsCtrl.findDetails(user.mapId); res.send(userMaps); } catch (error) { //handle error res.status(400).send(error) } } // user controll function getUser() { return new Promise(function(resolve, reject) { //data base read using mysql req.app.get("mysqlConn").query(query, function(error, results, fields) { if (error) { reject(error); } resolve(results); }); }) } //maps controller function is also like above one. <div ng-repeat="product in products | filter:company_filter"> ,因为OP说他有坐标,而子图搜索找到的坐标找不到相当大的红色斑点的确切中心,而是红色斑点的最左上角。