《我的眼睛--图灵识别》第七章:预处理:图像滤镜
《我的眼睛–图灵识别》第七章:预处理:图像滤镜
什么是滤镜?
滤镜就好比是一种药物,医生会针对不同情况的病人开不一样的药方,这样才能做到对症下药解决问题。一般是指针对数字图像的某种数学处理,比如:二值化、灰度、色调分离、清除杂点、获取轮廓、缩放及各种数据变换等等。
图像滤镜预处理是指在进行文字识别之前的一些准备工作,主要目的是突出图像上字符的有关信息,去掉原始图像中的显见噪声(干扰)等影响识别的无关信息。这一阶段的工作非常重要,处理的效果直接影响到文字识别的准确率。
对症下药
1、彩色图像滤镜
二值化
二值化(Binaryzation)即所谓的图像仅有两种的颜色存在,如:黑白图像,就是将一张彩色图像上的每个像素点(px)的颜色RGB分量值根据一定的阈值条件分别设置为0或255数值,也就是将整张图像呈现出明显的仅有黑色(背景)和白色(目标字符)的视觉效果。
二值化图像
1.利用RGB分量的平均值作为阈值条件:
当颜色RGB分量值的总和除以3,大于预设置的阈值128时,等于白色(16进制:FFFFFF,10进制:16777215),否则等于黑色(16进制:000000,10进制:0)。
白色 = (R + G + B) / 3 > 128
黑色 = (R + G + B) / 3 < 128
这样,就完成了对图像的二值化滤镜处理,呈现出明显的仅有黑色和白色的视觉效果。
滤镜效果
实现流程
VB6代码:
调用例子:
Dim 滤镜图像() As Byte
Call 滤镜_二值化_Average(图像数据, 128, 滤镜图像)
封装函数:
'阈值 = 128
Public Sub 滤镜_二值化_Average(图像数据() As Byte, 阈值 As Long, 返回滤镜图像() As Byte)
Dim w As Long, h As Long, 宽 As Long, 高 As Long, 平均值 As Long
Dim R As Byte, G As Byte, B As Byte
宽 = UBound(图像数据, 2)
高 = UBound(图像数据, 3)
For w = 0 To 宽
For h = 0 To 高
'为阈值条件
R = 图像数据(2, w, h)
G = 图像数据(1, w, h)
B = 图像数据(0, w, h)
平均值 = (CLng(R) + G + B) / 3
If 平均值 > 阈值 Then
'为白色
图像数据(0, w, h) = 255
图像数据(1, w, h) = 255
图像数据(2, w, h) = 255
Else
'为黑色
图像数据(0, w, h) = 0
图像数据(1, w, h) = 0
图像数据(2, w, h) = 0
End If
Next
Next
返回滤镜图像 = 图像数据
End Sub
按键精灵2014脚本:
调用例子:
Call Plugin.TULING.Pixel_FromScreen(0,0,200,100)
//显示获取的图像
Call Plugin.TULING.Pixel_Preview()
Call Plugin.TULING.Filter_Binaryzation("0-128") //二值化
Call Plugin.TULING.Pixel_Preview()
2.利用选取多个颜色值作为阈值条件:
可以直接通过拾取图像中所有文字上的颜色值作为阈值条件,符合其中某一个文字的颜色值时等于白色(16进制:FFFFFF,10进制:16777215),否则即为黑色(16进制:000000,10进制:0)。
拾取图像中的文字颜色值分别为:
数字0 (16进制:E1AC46,10进制:14789702) 数字5
(16进制:6465F2,10进制:6579698) 数字9 (16进制:AA5F61,10进制:11165537) 数字1
(16进制:47C280,10进制:4702848)
滤镜效果
实现流程
问题:
如何实现多值化滤镜处理效果?
比如实现三值化:黑(0,0,0),白(255,255,255),灰(127,127,127)。
(作业)三值化
VB6代码:
调用例子:
Dim 滤镜图像() As Byte
Dim 颜色串(2) As Long
颜色串(0) = 16777215
颜色串(1) = 0
颜色串(2) = 255
Call 滤镜_二值化_Picker(图像数据, 颜色串,滤镜图像)
封装函数:
Public Sub 滤镜_二值化_Picker(图像数据() As Byte, 颜色串() As Long, 返回滤镜图像() As Byte)
Dim w As Long, h As Long, 宽 As Long, 高 As Long, 查找颜色 As Long, 数量 As Long, n As Long
Dim R As Byte, G As Byte, B As Byte
宽 = UBound(图像数据, 2)
高 = UBound(图像数据, 3)
数量 = UBound(颜色串)
For w = 0 To 宽
For h = 0 To 高
'为阈值条件
R = 图像数据(2, w, h)
G = 图像数据(1, w, h)
B = 图像数据(0, w, h)
查找颜色 = RGB(R, G, B)
'为黑色
图像数据(0, w, h) = 0
图像数据(1, w, h) = 0
图像数据(2, w, h) = 0
For n = 0 To 数量
If 查找颜色 = 颜色串(n) Then
'为白色
图像数据(0, w, h) = 255
图像数据(1, w, h) = 255
图像数据(2, w, h) = 255
Exit For
End If
Next
Next
Next
返回滤镜图像 = 图像数据
End Sub
按键精灵2014脚本:
调用例子:
Dim 颜色串
Call Plugin.TULING.Pixel_FromScreen(0,0,200,100)
//显示获取的图像
Call Plugin.TULING.Pixel_Preview()
颜色串 = "FF0000|00FF00|0000FF|"
Call Plugin.TULING.Filter_Binaryzation(颜色串) //二值化
Call Plugin.TULING.Pixel_Preview()