实现这个功能会碰到各种各样的色彩的图片,而背景色彩与目标轮廓色彩相差各异,我们需要用到黑白两色的图片,我们需要先把彩色图片转换为灰度图,再把灰度图转换为黑白图。
彩色图片转换为灰度图算法一般是经验法已经足够了,Gray = 0.2989 * R + 0.5870 * G + 0.1140 * B,已经能够胜任大部分的图片使用,而且转换出的图片质量非常的棒。然后需要把图片转换成背白图片。
我们通常会使用一个阀值作为黑白像素的分界点,大于阀值统一为白色,小于阀值统一为黑色。
QImage imagebk = imageDa; QImage imagegry = imageDa; for(int j = 0;j < imagebk.width();j++) { for(int k = 0;k < imagebk.height();k++) { //uchar gryColor = (qBlue(imagebk.pixel(j,k))*299)/1000 + (qRed(imagebk.pixel(j,k))*587)/1000 + (qGreen(imagebk.pixel(j,k))*114)/1000; uchar gryColor = (qBlue(imagebk.pixel(j,k))*114)/1000 + (qRed(imagebk.pixel(j,k))*299)/1000 + (qGreen(imagebk.pixel(j,k))*587)/1000; QColor vRGB = imagebk.pixel(j,k); vRGB.setRed(gryColor); vRGB.setGreen(gryColor); vRGB.setBlue(gryColor); vRGB.setAlpha(255); imagegry.setPixelColor(j,k,vRGB); if(gryColor > 128) { gryColor = 0xff; } else { gryColor = 0x00; } vRGB.setRed(gryColor); vRGB.setGreen(gryColor); vRGB.setBlue(gryColor); vRGB.setAlpha(255); imagebk.setPixelColor(j,k,vRGB); } } imagegry.save("C:/Users/Administrator/Desktop/myImagegry.png"); imagebk.save("C:/Users/Administrator/Desktop/myImagebk.png");
下面是对一张彩色图片的处理效果,中间是灰度图,第三张是黑白图。
第一组
第二组
第三组
还需要优化两个问题:
问题1是图片反色的问题,方便显示设备显示使用。
问题2是图片黑白临界阀值的问题,以便尽量的保留出细节。
图片取模上位机界面如下: