在opencv中清理扫描的图像

Posted

技术标签:

【中文标题】在opencv中清理扫描的图像【英文标题】:Cleaning a scanned image in opencv 【发布时间】:2016-12-29 03:20:39 【问题描述】:

我正在尝试对图像进行降噪,然后提取包含手写线条的图像的骨架。我希望这条线是连续的和实心的,但我使用的方法无法做到这一点并且相对较慢。这是原始图像: Original Image

Morphed 在变形后的图像上,您可以在右下方看到一个小岛。

上面的细化图像显示线在末端附近断开。

还有其他方法可以达到预期的效果吗?

我的代码如下所示:

int morph_elem = 2;
int morph_size = 10;
int morph_operator = 0;

Mat origImage = imread(origImgPath, CV_LOAD_IMAGE_COLOR);
medianBlur(origImage, origImage, 3);
cvtColor(origImage, origImage, COLOR_RGB2GRAY);
threshold(origImage, origImage, 0, 255, THRESH_OTSU);

Mat element = getStructuringElement(morph_elem, Size(2 * morph_size + 1, 2 * morph_size + 1), cv::Point(morph_size, morph_size));

morphologyEx(origImage, origImage, MORPH_OPEN, element);
thin(origImage, true, true, true);

【问题讨论】:

在二值图像上(阈值后),您可以findContours,并删除小的图像,例如使用contourArea 【参考方案1】:

要减少断线,请尝试使用adaptiveThreshold,尝试各种方法和大小,看看哪种效果最好。 要移除这个小岛,只需执行findContours,然后使用drawContourscolor=(255,255,255)thickness=-1 屏蔽不需要的规格,然后使用wantedContours = [x for x in contours if contourArea(x) < 50] 之类的内容对其进行过滤。

【讨论】:

【参考方案2】:

您想对图像执行一系列关闭和打开操作。您最好了解它们如何工作以做出适当的选择。 看到这个帖子:Remove spurious small islands of noise in an image - Python OpenCV

【讨论】:

以上是关于在opencv中清理扫描的图像的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV实战——使用邻居访问扫描图像

OpenCV实战——使用邻居访问扫描图像

OpenCV实战——实现高效图像扫描循环

OpenCV-怎样扫描图像查找表和运行效率的测定

openCV进阶之二:自动校准扫描图像生成鸟瞰图

OPENCV学习笔记12_扫描图像并访问相邻像素