我正在尝试检测模拟仪表的某些仪表读数。我目前正在使用亚马逊识别服务从反应原生应用程序中的仪表中提取读数。该过程效果不佳,因此作为尝试解决此问题的一部分。我在应用程序中实现了裁剪功能,因此我们只将图像的相关部分发送到服务。我遇到了另一个问题。仪表上的模拟分隔符散布在其中,因此它们被读取为一个。
未裁剪的仪表图像 未裁剪的仪表图像
来自移动应用程序的 裁剪图像 来自移动应用程序的裁剪图像
我已经尝试过。在将图像发送到 rekognito 之前,我创建了一个简单的服务器应用程序来尝试删除这些行
- 将图像转换为灰度
- 应用高斯模糊来消除一些噪声。
- 应用 [canny 算法 ( https://en.wikipedia.org/wiki/Canny_edge_detector ) 来检测边缘。
const { img } = req.params; // Mat
const grayWithGaussianBlur = img
.cvtColor(cv.COLOR_BGR2GRAY)
.gaussianBlur(new cv.Size(5, 5), 0, 0, cv.BORDER_DEFAULT)
.canny(30, 150);
结果看起来像这样。 结果
输出如我所料。我一直在试图弄清楚如何去除散布的边缘,留下明确定义的边缘。
我过滤了轮廓,只留下满足特定标准的轮廓。喜欢面积大于某个阈值,
const contours = grayWithGaussianBlur.copy().findContours(cv.RETR_TREE, cv.CHAIN_APPROX_NONE);
const viable = contours.filter(contour => {
const { width,height } = contour.boundingRect();
return width > 5 && width <= height; // example criteria
});
const newImage = new cv.Mat(grayWithGaussianBlur.rows, grayWithGaussianBlur.cols, 0);
newImage.drawContours(viable, new cv.Vec3(255, 255, 255), -1);
无法让这个工作。
我对图像处理概念的理解非常模糊,我不确定这是解决这个问题的好方法。我也不太了解我在做什么:)。
抱歉,我没有足够的声望直接嵌入图片。
任何人都可以帮助或建议更好的方法来去除线条。提前致谢。