答案 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
在重新阅读问题时,我注意到你实际上只想要水平最近的点,而我上面的解决方案在任何方向都适合一般情况。如果您只想要水平偏移,并且您知道水平线位于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在这种情况下。
我使用了与子图片搜索生成的rx
和ry
略有不同的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说他有坐标,而子图搜索找到的坐标找不到相当大的红色斑点的确切中心,而是红色斑点的最左上角。