ComicEnhancerPro 系列教程十七:二值化图像去毛刺
作者:马健
邮箱:stronghorse_mj@hotmail.com
主页:http://www.comicer.com/stronghorse/
发布:2017.07.23
教程十七:二值化图像去毛刺
在灰度图像处理成纯黑白(二值化)图像以后,经常出现的一个问题是轮廓边缘出现毛刺。如下面这个图像:

为了看得更清楚,放大到800%并加网格线:

可以看出在“工”字的上面一横中,上边缘有几个突出点,下边缘有两个凹陷点,而在“业”字左侧竖条中有突出点,下面一横中有凹陷点。
产生毛刺的原因是:在扫描或拍摄所生成的原始图像中,轮廓边缘像素点的值其实是介于“白”与“黑”之间的“灰”,所以整个边缘看起来很光滑、不生硬,但变成纯黑白后,像素点非黑即白,不再有中间灰,所以总有那么几个点可能就因为值稍微差了一点,就与周围的不一样了。
具体可以参见本系列教程“后记”中“常见问题之二:扫描图像中的黑、白、灰”部分。
所以解决的办法就是:
- 让模糊来得更猛烈一些吧!如果模糊得更均匀一些,这种毛刺现象其实会更少一点。所以在本系列教程的其它部分给出的处理参数中,经常会看到在选择纯黑白后,用高斯模糊来消毛刺。另外对图像进行放大也会拉出一些模糊空间,一方面可以减轻毛刺,另一方面可以避免转成纯黑白图像后出现笔画粘连——所以我一直觉得在
针对扫描书籍的图像处理教程中,如果只提二值化却不提放大,就是在骗鬼。 - 用数字图像处理中的形态学方法识别孤立点、凹陷点,然后去除或填平。
在ScanTailor(以下简称ST)中用的就是第2种方法,在CEP
v4.13中被引进:在“色彩设置”界面中如果在“色彩数”中选择“纯黑白”,再勾选“边缘去毛刺”,即可使用这种方法。
这种方法的原理是:
- 先总结常见的边缘毛刺形状(孤立点或凹陷点)及修正方法(去除或填平),并以字符串的形式定义成模板。
- 用形态学中的击中-击不中变换(Hit-Miss
Transform),在整张图像中查找能与模板匹配的像素点,然后按照模板对像素进行去除或填充。
在ST中总结出来的模板共有6个,分别是:
| 1 | 2 | 3 | 4 | 5 | 6 |
| "XXX" " - " " " |
"X ?" "X " "X- " "X- " "X " "X ?" |
"X ?" "X ?" "X " "X- " "X- " "X- " "X " "X ?" "X ?" |
"XX?" "XX?" "XX " "X+ " "X+ " "X+ " "XX " "XX?" "XX?" |
"XX?" "XX " "X+ " "X+ " "XX " "XX?" |
" " "X+X" "XXX" |
在模板中共有5种符号:X表示黑点,空格表示白点,问号表示黑点白点均可,减号表示去除点,加号表示填充点。所以上表中的前3个模板就表示如果在一排黑点外有孤立点,则孤立点应去除,如上面示例图中“工”字上面一横中的几个孤立点;后3个模板则表示如果黑点中间有凹陷点,则应该进行填充,如上面示例图中“业”字底下一横中的几个凹陷点。
在ST中,每个模板会在上、下、左、右4个方向分别匹配,以模板1为例,其实在内部会扩充为以下4个模板进行匹配:
| "XXX" " - " " " |
" " " - " "XXX" |
"X " "X- " "X " |
" X" " -X" " X" |
因此6个模板其实内部要匹配24次,在图像较大时就会显得很慢,这也是我平时更喜欢用模糊来进行平滑的原因:CEP中的高斯模糊还是很快的。
整个处理过程的核心是在图像中查找模板的所有匹配点,即需要去除、填充的点,用的是击中-击不中变换(Hit-Miss
Transform)。在我看过的教科书中包括ST的源代码本身,都是用腐蚀、膨胀等形态学基本操作的组合来实现这个变换,但我个人认为多次双循环会拖累代码的整体执行速度,所以在实现时我是按照这个变换最原始的定义实现的,一次双循环周游整个图像就找出所有匹配点,速度比ST略快,但内存消耗比ST大。
上面示例图用CEP去除毛刺后的效果:
放大到800%并加网格线的效果:
可以看出,横线、竖线上的孤立点都被去除,凹陷点也被填平,文字看起来干净了许多。
ComicEnhancerPro 系列教程十七:二值化图像去毛刺的更多相关文章
- opencv 删除二值化图像中面积较小的连通域
对于上图的二值化图像,要去除左下角和右上角的噪点,方法:使用opencv去掉黑色面积较小的连通域. 代码 CvSeq* contour = NULL; double minarea = 100.0; ...
- (Opencv4)二值化图像
(Opencv4)二值化图像 ret, dst = cv2.threshold(src, thresh, maxval, type) threshold : 极限,临界值,阈值 ret: 一个数 s ...
- C# 指针操作图像 二值化处理
/// <summary> /// 二值化图像 /// </summary> /// <param name="bmp"></param& ...
- OpenCV---超大图像二值化和空白区域过滤
超大图像的二值化方法 1.可以采用分块方法, 2.先缩放处理就行二值化,然后还原大小 一:分块处理超大图像的二值化问题 def big_image_binary(image): print(image ...
- 10、OpenCV Python 图像二值化
__author__ = "WSX" import cv2 as cv import numpy as np #-----------二值化(黑0和白 255)---------- ...
- python实现超大图像的二值化方法
一,分块处理超大图像的二值化问题 (1) 全局阈值处理 (2) 局部阈值 二,空白区域过滤 三,先缩放进行二值化,然后还原大小 np.mean() 返回数组元素的平均值 np.std() 返回数 ...
- [转载+原创]Emgu CV on C# (四) —— Emgu CV on 全局固定阈值二值化
重点介绍了全局二值化原理及数学实现,并利用emgucv方法编程实现. 一.理论概述(转载,如果懂图像处理,可以略过,仅用作科普,或者写文章凑字数) 1.概述 图像二值化是图像处理中的一项基本技术,也 ...
- 灰度图像二值化-----c++实现
前天闲着没事干,就写了写BMP图像处理,感觉大家还比较感兴趣..所以现在没事,继续更新..这次简单的写了灰度图像二值化..这是什么概念呢? 图像的二值化的基本原理 图像的二值化处理就是将图像上的点的灰 ...
- Wellner 自适应阈值二值化算法
参考文档: Adaptive Thresholding for the DigitalDesk.pdf Adaptive Thresholding Using the Integral I ...
随机推荐
- [转载]amba_device使用分析
什么是AMBA? ---AMBA是一个片内总线规范. ARM官网的介绍:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0 ...
- 【转】使用Jmeter录制web脚本
1.web性能测试以及web http请求基本原理. 再介绍录制jmeter脚本之前,我们先谈一下web性能测试.web就是调用http/https接口, 其实没有是什么复杂度可言.只是我们必须清楚, ...
- Spring XML和Annotation混合配置的时候,XML中Bean名称写错会导致启动异常不打印、死循环
今天做Tomcat迁移Spring Boot,遇到一个坑.启动没有错误,CPU特别高 经过把堆栈kill -3 打印出来,发现堆栈特别长(没有死循环),所有的堆栈信息都集中在org.springfra ...
- linnx常用命令学习
ll命令就相当于ls -l. [-][rwx][r-x][r--] [-] 代表这个文件名为目录或文件(d为目录-为文件) [rwx]为:拥有人的权限(rwx为可读.可写.可执行) [r-x]为:同群 ...
- MVC 公共类App_Code不识别
.Net MVC需要写公共类的时候 右击添加 App_Code 文件夹,新建类—>右击类—>属性,生成操作 —>选择 —>编译 .net MVC项目本身是个应用程序,所以其实不 ...
- 2014.9.30 Double转字符
(57.0/60.0).ToString("f2")="0.95" 等于 string.Format("{0:F2}",57.0/60)=& ...
- javascript中的装箱和拆箱操作
1,装箱: 把基本数据类型转换为对应的引用类型的操作称为装箱,把引用类型转换为基本的数据类型称为拆箱. 在<javascript高级程序设计>中有这样一句话: 每当读取一个基本类型的时候, ...
- android 除法运算保留小数点
java保留两位小数问题: 方式一: 四舍五入 double f = 111231.5585; BigDecimal b = new BigDecimal(f); double f1 = b.setS ...
- 解决 Python 连不上pip库的问题(使用国内镜像地址)
经常在使用python的时候需要安装各种模块,而pip是很强大的模块安装工具,但是由于国外官方pypi经常被墙,导致不可用,所以我们最好是将自己使用的pip源更换一下,这样就能解决被墙导致的装不上 ...
- Priceless Notes
[Priceless Notes] 1.人类对价格的绝对值没有准确的判断,但是价格或物体的相对值有较准确的判断. 2.物理强度与主观体验的关联成幂曲线.如60瓦的灯会让人觉得亮,但要让人觉得2倍亮的话 ...