實現這個功能會碰到各種各樣的色彩的圖片,而背景色彩與目標輪廓色彩相差各異,我們需要用到黑白兩色的圖片,我們需要先把彩色圖片轉換為灰度圖,再把灰度圖轉換為黑白圖。
彩色圖片轉換為灰度圖算法一般是經驗法已經足夠了,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是圖片黑白臨界閥值的問題,以便盡量的保留出細節。
圖片取模上位機界面如下: