首页 > 技术文章 > QT图片取模 彩色图转换为黑白图

logicexpression 2021-05-27 17:25 原文

实现这个功能会碰到各种各样的色彩的图片,而背景色彩与目标轮廓色彩相差各异,我们需要用到黑白两色的图片,我们需要先把彩色图片转换为灰度图,再把灰度图转换为黑白图。

彩色图片转换为灰度图算法一般是经验法已经足够了,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");

下面是对一张彩色图片的处理效果,中间是灰度图,第三张是黑白图。

第一组

u=1696053968,2389900790&fm=26&gp=0myImagegrymyImagebk

第二组

u=101516629,1823603130&fm=26&gp=0myImagegrymyImagebk

第三组

u=1792738448,2515560561&fm=11&gp=0myImagegrymyImagebk

还需要优化两个问题:

问题1是图片反色的问题,方便显示设备显示使用。

问题2是图片黑白临界阀值的问题,以便尽量的保留出细节。

图片取模上位机界面如下:

捕获

推荐阅读