本座正在进行开发的一个高科技项目中,重度地使用了 opencv做机器视觉的处理。其中有一个步骤是要把一张图片做阈值化处理。
opencv里已经有阈值处理的函数threshold,但是该函数只支持 8位图片,也就是实际上对彩色图片是不支持的。要想对彩色图片使用这个函数,首先要将彩色图片转换成灰度图片,在这个转换过程中就丢失了一些颜色信息。这样的结果就是,最终得到的阈值化图片不太理想。
而本座在研究算法时,使用 GIMP做了试验。发现 GIMP的阈值化处理,对于彩色图片的处理效果比opencv的好多了。
下面有几张图片做对比。
上面这是原图
上面这是使用 opencv的阈值化函数处理的结果,图中 164表示的是这次阈值处理所采用的阈值参数,是使用OTSU算法计算出来的
上面这是使用 GIMP,按照同样的阈值参数做阈值化处理的结果
在 opencv中进行32位色到8位色转换时,丢失了一些颜色细节,导致最终的阈值化处理结果中,右上角出现大块黑影。 GIMP不进行这种转换,直接拿32位的原图来做阈值化处理,所以对于示例中这种特征的图片,效果好狠多。
于是本座决定研究一下 GIMP的源代码。
研究之后,发现GIMP中的阈值化处理源代码是狠简单的。对于每个像素,分别取出其红绿蓝三个分量,将三个分量中的最大值与设定的阈值做比较,超过阈值,则此像素的颜色改写成全 255(最大值,也就是白色),未超过阈值,则此像素的颜色改写成全0(最小值,也就是黑色)。
于是就把 GIMP这段代码借鉴过来,果然在本座自己的高科技系统中阈值处理这一步的效果更理想了。
金正日的妞
HxLauncher: Launch Android applications by voice commands