OpenCV和Halcon分别实现彩色图像的白平衡效果

简介: OpenCV和Halcon分别实现彩色图像的白平衡效果

实现白平衡算法中的灰度世界法,能有效改善图像发红/发蓝/发绿的现象


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


相关文章
|
4月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
922 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
5月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
76 4
|
5月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
6月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
6月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
181 1
|
8月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
282 1
|
8月前
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
113 1
|
8月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
147 0
|
7月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
8月前
|
计算机视觉
OpenCV中图像算术操作与逻辑操作
OpenCV中图像算术操作与逻辑操作
90 1