天天看點

模式識别---圖像二值化

要對圖像進行識别,首先要做的将圖像從多通道顔色分量變為單通道,也就是gray色調中來,常用的方法有目下三種,

第一種

 求rgb顔色風量的平均值: 

          G(x,y) =(r(x,y)+g(x,y)+b(x,y))/3.

第二種:

       視覺心理學公式:

         G(x,y)= r(x,y)*299 + g(x,y)*587 + b(x,y)*114/1000

還有一種:

       G(x,y) = r(x,y)*0.11 + g(x,y)*0.59 + b(x,y)*0.3;

第三種: Adobe Photoshop 采取的公式 

​     Adobe RGB (1998) [gamma=2.20] 

     Gray = (R^2.2 * 0.2973 + G^2.2 * 0.6274 + B^2.2 * 0.0753)^(1/2.2)​

速度依次變慢,效果逐漸變好.

采用第二種效果進行将彩色圖檔灰階化:(關鍵代碼)

1   for(int i=0;i<cinfo.image_width;i++) {
 2                color_r = (int)buffer[0][i*3];
 3                color_g = (int)buffer[0][i*3+1];
 4                color_b = (int)buffer[0][i*3+2];
 5                var_gray = 0.11*color_r+0.59*color_g+0.3*color_b;
 6                if(var_gray<0) var_gray=0;
 7                //else var_gray =255;
 8                buffer[0][i*3]=(unsigned char)(var_gray&0xff);
 9                buffer[0][i*3+1]=(unsigned char)(var_gray&0xff);
10                buffer[0][i*3+2]=(unsigned char)(var_gray&0xff);
11            }      

效果圖:

模式識别---圖像二值化
模式識别---圖像二值化

一般進過從多通道顔色分量處理之後,就需要對圖像進行腐蝕,然後得到二值化圖像。需要設定一個門檻值,進行單純的判斷,這是最簡單的方式

1   for(int i=0;i<cinfo.image_width;i++) {
 2                color_r = (int)buffer[0][i*3];
 3                color_g = (int)buffer[0][i*3+1];
 4                color_b = (int)buffer[0][i*3+2];
 5                var_gray = 0.11*color_r+0.59*color_g+0.3*color_b;
 6                if(var_gray<128) var_gray=0;
 7                else var_gray =255;
 8                buffer[0][i*3]=(unsigned char)(var_gray&0xff);
 9                buffer[0][i*3+1]=(unsigned char)(var_gray&0xff);
10                buffer[0][i*3+2]=(unsigned char)(var_gray&0xff);
11            }      

效果圖:

模式識别---圖像二值化