实现白平衡算法中的灰度世界法,能有效改善图像发红/发蓝/发绿的现象
1、OpenCV
#include <opencv2/opencv.hpp> using namespace cv; int main() { Mat g_srcImage,dstImage; vector<Mat> g_vChannels; g_srcImage = imread("C:/Users/Administrator/Desktop/01.jpg"); imshow("原图",g_srcImage); //waitKey(0); //分离通道 split(g_srcImage, g_vChannels); Mat imageBlueChannel = g_vChannels.at(0); Mat imageGreenChannel = g_vChannels.at(1); Mat imageRedChannel = g_vChannels.at(2); double imageBlueChannelAvg = 0; double imageGreenChannelAvg = 0; double imageRedChannelAvg = 0; //求各通道的平均值 imageBlueChannelAvg = mean(imageBlueChannel)[0]; imageGreenChannelAvg = mean(imageGreenChannel)[0]; imageRedChannelAvg = mean(imageRedChannel)[0]; //求出个通道所占增益 double K = (imageRedChannelAvg+imageGreenChannelAvg+imageRedChannelAvg) / 3; double Kb = K / imageBlueChannelAvg; double Kg = K / imageGreenChannelAvg; double Kr = K / imageRedChannelAvg; //更新白平衡后的各通道BGR值 addWeighted(imageBlueChannel,Kb,0,0,0,imageBlueChannel); addWeighted(imageGreenChannel,Kg,0,0,0,imageGreenChannel); addWeighted(imageRedChannel,Kr,0,0,0,imageRedChannel); merge(g_vChannels,dstImage);//图像各通道合并 imshow("白平衡后图",dstImage); waitKey(0); return 0; }
API详解:
void cvAddWeighted( const CvArr* src1, double alpha,const CvArr* src2, double beta,double gamma, CvArr* dst );
参数1:src1,图1
参数2:alpha,图1数组元素权重
参数3:src2,图2
参数4:beta,图2数组元素权重
参数5:gamma,图1与图2叠加之后再添加的数值。不要太大,不然图片一片白。总和等于255以上就是纯白色了。
参数6:dst,输出图片
即:目标图=src1*alpha+src2*beta+gamma
2、Halcon
dev_close_window () read_image (Image, 'D:/hellowprld/2/test777.jpg') dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) dev_display (Image) *将图像进行通道分解,分别转换为三个通道的RGB图像 decompose3 (Image, Red, Green, Blue) *实现白平衡算法中的灰度世界法,能有效改善图像发红/发蓝/发绿的现象 *取RGB各个通道的平均值 get_domain (Red, Domain) intensity (Domain, Red, MeanRed, DeviationRed) get_domain (Green, Domain) intensity (Domain, Green, MeanGreen, DeviationGreen) get_domain (Blue, Domain) intensity (Domain, Blue, MeanBlue, DeviationBlue) *求出个通道所占增益 K := (MeanRed + MeanGreen + MeanBlue) / 3.0 Kr := K / MeanRed Kg := K / MeanGreen Kb := K / MeanBlue *更新白平衡后的各通道值White Balance scale_image (Red, ImageScaledRed, Kr, 0) scale_image (Green, ImageScaledGreen, Kg, 0) scale_image (Blue, ImageScaledBlue, Kb, 0) compose3(ImageScaledRed, ImageScaledGreen, ImageScaledBlue, Multichannel0) write_image (Multichannel0, 'jpeg 100', 0, 'D:/opt.jpg') stop()
---------------附录--------------------
两幅图像之间处理的算子
1.sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : )
对两幅图像做减法 g' := (g1 - g2) * Mult + Add
程序如下:
read_image (Scene00, 'autobahn/scene_00')
read_image (Scene01, 'autobahn/scene_01')
sub_image (Scene00, Scene01, ImageSub1, 1, 0)
dev_display(ImageSub1)
2.abs_image(Image : ImageAbs : : )
计算图像的绝对值模型
3.crop_part(Image : ImagePart : Row, Column, Width, Height : )
剪切出一个长方形的图像
4.add_image(Image1, Image2 : ImageResult : Mult, Add : )
两图像相叠加 g' := (g1 + g2) * Mult + Add
5.max_image(Image1, Image2 : ImageMax : : )
计算两幅图像每个像素点的最大值
6.min_image(Image1, Image2 : ImageMin : : )
计算两幅图像每个像素点的最小值
7.div_image(Image1, Image2 : ImageResult : Mult, Add : )
两幅图像相除 g' := g1 / g2 * Mult + Add
8.mult_image(Image1, Image2 : ImageResult : Mult, Add : )
两幅图像相乘 g' := g1 * g2 * Mult + Add