归一化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’

物理上,这种变换方式从图像上移除了光照的信息。

你可能感兴趣的:(machine,vision)