算法四 先根据底 {MOD}粗定位再扫描精确定位
此算法程序的操作顺序是:“读入图像”—“灰度化”—“直方图均衡化”—“二值化”—“粗定位”—“反 {MOD}操作”—“形态学处理”—“精确定位”。
1、 先去掉电表图像的下半部分,保留上半部分用于定位
条件:
(1) 拍照时下对电表且图像刚好包含电表的所有区域;
(2) 电表计数区域都在电表的上半部分(椐观察6个电表,它们的计数区域都在电表的上半部分)。
方法:
使用了OpenCV中的LoadRect()函数来对原图像进行截取。
2、 图像预处理
(1)图像灰度化
在这里使用加权值法:R=G=B=0.299R + 0.587G + 0.114B
加权值法可以得到最适合的灰度图像
(2)直方图均衡化
(3)中值滤波
因环境光照及照相机闪光灯等原因,拍摄出来的照片可能会存在反光现象,所以要
用中值滤波去掉一些噪声,方便后续处理。
(4)图像二值化
采用全局阈值的方法(T = Gmax –(Gmax - Gmin)/3)
二值化电表灰度图像时暗一点的地方就一片黑 {MOD},而白的地方又一片白 {MOD}。
用此方法来进行电表图像的二值化,效果得不到保证。
当运用公式(T = Gmax –(Gmax - Gmin)/2)时,在某一些图片可行,但是在其他图片不行,不具有普遍性。
3、 粗定位
在预处理得到的图像中从下到上扫描,当扫描到一行有等于或大于RMIN的连续的灰度值为0的点时记录此行,然后再继续向下扫描,当又扫描了N行或者超过N行且此行为刚刚有小于RMIN个连续的灰度值为0的点的行时记录此行。上两行间的区域为候选区域。
因为在读入电表图像时,已经截去了电表图像的上部分中的个像素的部分和下半部分,所以自下向上扫描得到的第一个区域就应该是电表读数区域。
4、 对上一步中得到的候选区域进行精确定位
(1) 反 {MOD}处理
对由粗定位得到的区域进行反 {MOD}操作,为后面的数学形态学操作做准备。反 {MOD}处理
是指把二值图像数据中的灰度为0的像素改为255,把灰度为255的像素改为0。
(2) 数学形态学操作
对经过反 {MOD}处理后的图像进行数学形态学操作,以使电表读区域连成一片,以用作
后面的精确定位。在程序中所用到的数学形态学操作是先进行闭运算操作,再进行腐蚀操作,连续执行这样的操作几次,以达到所要求的效果。
(3) 精确定位
对由数学形态学操作后的图像进行精确定位。
首先把图像数据中第行的三个信息存到一个数组中:一是是否有大于行阈值的连续白点;二是连续白点的开始端点,如果无则为-1;三是连续白点的结束端点,如果无则为-1。
然后遍历这个数组,按如下规则:
1、向下扫描,当当前行没有大于阈值的连续白点时,继续向下扫描;
2、当遇到大于阈值的行时,将此行的行号记于变量m_iCPHeightTop中,继续向下扫描;
3、当遇到小于阈值的行且行距小于行距阈值时,m_iCPHeightTop记为,返回到;
4、当遇到大于阈值的行且行距大于行距阈值时,不作处理,继续向下扫描;
5、当遇到大于阈值且行距大于行距阈值时,不作处理,继续向下扫描;
6、当遇到小于阈值肖行距大于行距阈值时,将此行的行号记于m_iCPHeightBottom中;
7、当扫描完成后,确定左右边界。