OCR:Low-contrast/noisy 个区域
OCR: Low-contrast/noisy regions
我正在尝试识别下面显示的 17 个字符的代码。
我目前正在为我的管道使用 OpenCV:
(1) 转换为黑白图像
(2) 计算梯度图像
(3) 大津阈值
(4) 求轮廓
(5) 求轮廓边界框
在图像比较干净的情况下效果很好。在上面的示例中,我能够检测到 "H26A838778"。有谁知道如何处理图像的左侧,那里的对比度低且水印增加了噪点?
您可以尝试使用 Simple Thresholding
对图像进行阈值处理
由于字符之间的颜色相同或相近,且颜色值比背景高(更白),可以尝试找到使字符颜色保持白色和所有颜色的阈值颜色值否则为黑色。在下面的例子中(Java 代码),这个数字是 140。
Mat original = Imgcodecs.imread("pathToOriginalImage");
Mat gray = new Mat();
Imgproc.cvtColor(original, gray, Imgproc.COLOR_RGB2GRAY, 0);
Mat binary = new Mat();
Imgproc.threshold(original,binary,140,255,Imgproc.THRESH_BINARY);
转换为灰度
阈值化
OCR 现在应该会给出一些不错的结果。
我正在尝试识别下面显示的 17 个字符的代码。
我目前正在为我的管道使用 OpenCV:
(1) 转换为黑白图像
(2) 计算梯度图像
(3) 大津阈值
(4) 求轮廓
(5) 求轮廓边界框
在图像比较干净的情况下效果很好。在上面的示例中,我能够检测到 "H26A838778"。有谁知道如何处理图像的左侧,那里的对比度低且水印增加了噪点?
您可以尝试使用 Simple Thresholding
对图像进行阈值处理由于字符之间的颜色相同或相近,且颜色值比背景高(更白),可以尝试找到使字符颜色保持白色和所有颜色的阈值颜色值否则为黑色。在下面的例子中(Java 代码),这个数字是 140。
Mat original = Imgcodecs.imread("pathToOriginalImage");
Mat gray = new Mat();
Imgproc.cvtColor(original, gray, Imgproc.COLOR_RGB2GRAY, 0);
Mat binary = new Mat();
Imgproc.threshold(original,binary,140,255,Imgproc.THRESH_BINARY);
转换为灰度
阈值化
OCR 现在应该会给出一些不错的结果。