實作白平衡算法中的灰階世界法,能有效改善圖像發紅/發藍/發綠的現象
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