得到了灰度图之后,接下来得做一个事情,就是把灰度图转换成二值图。二值图的意思就是这张图里面的像素值只有两种情况,一般来说肯定是希望要么是白色要么是黑色。
这个事情怎么做?其实也非常简单。
·逻辑就是可以通过一个阈值来进行划分。就比如看到这张图这个颜色比较亮一点的是背景,颜色比较暗一点的是要提取出来的这些所有的字符,点还有线,所以就可以通过阈值化来进行处理。阈值化是这样子cv2.threshold,这个函数有这么几个参数。
→第一个是原图,原图肯定就是灰度图。
→接下来就是thresh,thresh就是阈值。这张图里面比较亮一点的是背景,比较暗一点的是些线、字母,所以可以先随便设一个阈值,比如说搞一个50。
→接下来还有一个参数是什么?是Max value。当像素值超过阈值之后,像素点会变成什么样一个值?比如这里写个255。
→再接下来就是type,type是这个样子就是cv2.然后thresh这里有很多种选项,来试一下比如这个binary,再把这个结果给拿过来。这个阈值函数的结果会返回两个数据。
→第一个就是所设定的阈值是多少,这里设定的50这个结果对我们来说是没什么用的。
→第二个结果就是阈值化之后的结果。可以这样子下划线,然后来个img,下划线意思就是虽然给我两个结果,但是第一个结果其实不在意的,只是把它接过来而已。
·然后来试一下,大家可以看到这个玩意已经变成全是白色的了,这个阈值肯定是不对的,比如设一个20看一下行不行,还是白色的,50不行,20不行,肯定是阈值低了。
来一个,比如140,大家可以看到什么情况,是不是有点效果了?起码这5个字符是黑色的了,背景是白色的,但是效果还是不尽人意。再来调一调,比如说来一个170,厉害吧?再调大一点,好像这个值越大效果越好。是不是已经变成二值图了,这个字符还有点还有线,就是黑色的,背景是白色的。
这样一看其实这几个参数就非常明显了,其实这个阈值化就是看我原图里面每一个像素点的像素值。如果像素值是大于190的,那么就给他一个255的值,否则就是给他一个0的值。
为什么是0?是通过这个来的,thresh_forge。如果想是变成一个黑底白字应该怎么办?其实可以这样子后面加个INV,也就是把这个行为反过来。你看出来了吧。
现在虽然已经能够得到这样的一个比较好的效果了,但是你会发现效果的好坏是不是取决于这样一个阈值。有没有一种方式能够自动的帮我确定阈值,达到一个比较好的效果?有。那就是把这样一个参数改成什么?thresh_otsu也是比较著名的大津法。
如果把这个参数填成这个阈值对我们来说就是填了跟没填一样,因为它是自己帮我们确定的,既然它是自己帮我们确定的。如果想知道帮我们确定的阈值是多少,这个东西就有用了。所以可以搞一个变量,比如说thresh,再把thresh打出来,再来看一下效果。大家可以看到这个效果还可以了吧。而且给自己算出来的阈值是200。如果我这里就算填1,那它的效果也是一样的。
所以如果你想偷懒,想要Opencv来自动帮我们确定阈值,你就可以用Otsu。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved