电表图像中电表计数区域定位算法

2019-04-13 16:32发布

算法四 先根据底 {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、当扫描完成后,确定左右边界。