1. 程式人生 > >RGB影象歸一化

RGB影象歸一化

通過對影象的RGB色彩空間進行歸一化處理,在某些情況下是去除光照和陰影影響的一種簡單和有效的方法。

假設RGB代表原影象某點的畫素值,rgb表示歸一化之後的值,則

r = R / (R+G+B);g = G / (R+G+B);b = B / (R+G+B);

實現歸一化RGB的方法如下:

// 對輸入的原始RGB影象獲取對應的歸一化影象

IplImage* NormalizeImage(IplImage *img)

{

1、建立歸一化的影象;

IplImage* imgavg = cvCreateImage(cvGetSize(img), 8, 3);

2、獲取影象高度和寬度資訊,設定epslon的目的是防止除0的操作產生;

int width = img->width;int height = img->height;int redValue, greenValue, blueValue;double sum, epslon = 0.000001;

3、計算歸一化的結果,並替換掉原畫素值;

for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {

CvScalar src = cvGet2D(img, y, x);redValue = src.val[0];greenValue = src.val[1];blueValue = src.val[2];// 加上epslon,為了防止除以0的情況發生 sum = redValue + greenValue + blueValue + epslon;CvScalar des = cvScalar(redValue / sum * 255, greenValue / sum * 255, blueValue / sum * 255, src.val[4]);cvSet2D(imgavg, y, x, des);

}}     

4、返回歸一化後的影象;

return imgavg;

}

注意:歸一化之後的影象僅使用兩個位元組便可以表示一個畫素值,

r = R/(R+G+B)

g = G/(R+G+B)
b = B/(R+G+B)

b可以表示為:b = 1-R’-G’

物理上,這種變換方式從影象上移除了光照的資訊。