c – 将图像裁剪成碎片然后加入,是否可以使用OpenCV?
作者:互联网
我有几个彩色图像样本,我应该变成二进制.我通过使用自适应阈值获得了最好的结果.
这些数字非常好,定义明确,但周围很嘈杂,例如,将每个数字分开的这些“垂直线”最终被读作数字1的OCR工具.
然后我注意到数字周围的图像很干净.我想如果我只能剪掉数字(在制作黑白图片之前或之后?)然后将这些数字“粘贴”为白色背景.
我试过应用侵蚀和扩张,但仍然有许多剩余的“点”.如果我可以做我正在考虑的事情(上图),它将减少侵蚀/扩张并增加切割前数字周围的“清洁”,我不知道.
那可能吗?我有道理吗?如果是,我怎么能用OpenCV做到这一点?有什么建议?
我正在使用的一些图片:
注意:上面的图像没有经过侵蚀和/或扩张过程,只有自适应阈值处理.
更新:
@ Mahm00d,我尝试了你用第一张图片说的话,我得到了下面的图片,这是非常好的,但前两个数字反射的问题仍在继续.有没有什么办法解决这一问题?我应用了自适应阈值,但图像仍然很大.
具有OTSU标志的GaussianBlur阈值:
GaussianBlur自适应阈值:
解决方法:
在进行阈值处理和形态学处理之前,首先使用一些去噪技术(如高斯/中值模糊)通常很好:
(Java代码)
Imgproc.cvtColor(inputMat, gMat, Imgproc.COLOR_RGB2GRAY);
// Gaussian blur : 21x21 window, sigma = 50.0 (select these accordignly)
Imgproc.GaussianBlur(gMat, gMat, new Size(21.0, 21.0), 50.0);
// Otsu thresholding (or any other thresholding techinique...)
Imgproc.threshold(gMat, gMat, 0, 255, Imgproc.THRESH_OTSU | Imgproc.THRESH_BINARY);
你的输出:
以上代码输出:
更新:
这些问题通常需要使用参数值来获得良好的结果并获得最佳值.在第二个图像的情况下,这是我使用的代码(自适应阈值),以获得更好的结果:
Imgproc.GaussianBlur(inImg, inImg, new Size(21.0, 21.0), 50.0);
Imgproc.adaptiveThreshold(inImg, inImg, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 111, -20);
结果:
当然它并不完美,但至少反射被删除了.此外,形态学过程可以帮助产生更好的结果.
标签:edge-detection,c,opencv,image-processing,computer-vision 来源: https://codeday.me/bug/20190831/1774593.html