OpenCV-图像色温

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV-图像色温相关的知识,希望对你有一定的参考价值。

作者:Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

实现原理

       色温是表示光线中包含颜色成分的一个计量单位。从理论上说,黑体温度指绝对黑体绝对零度(-273℃)开始加温后所呈现的颜色。黑体在受热后,逐渐由黑变红,转黄,发白,最后发出蓝色光。当加热到一定的温度,黑体发出的光所含的光谱成分,就称为这一温度下的色温,计量单位为“K”(开尔文)。

       在图像处理中,对图像进行色温调整也是常见的操作之一。一般情况下,认为暖色偏黄色,冷色偏蓝色,基于此逻辑,在提高色温的时候,对红色和绿色通道进行增强,对蓝色通道进行减弱,这样就能让图像的黄色占比提高,进而达到暖黄色的效果;反之亦然,降低色温,只需要增强蓝色通道,减少红色和绿色。

        至此,图像实现了色温的调整。C++实现代码如下。

功能函数代码

// 色温调节
cv::Mat ColorTemperature(cv::Mat input, int percent)
{
	cv::Mat result = input.clone();
	int row = input.rows;
	int col = input.cols;
	int level = percent/2;
	for (int i = 0; i < row; ++i)
	{
		uchar* a = input.ptr<uchar>(i);
		uchar* r = result.ptr<uchar>(i);
		for (int j = 0; j < col; ++j)
		{
			int R,G,B;
			// R通道
			R = a[j * 3 + 2];
			R = R + level;
			if (R > 255) {
				r[j * 3 + 2] = 255;
			}
			else if (R < 0) {
				r[j * 3 + 2] = 0;
			}
			else {
				r[j * 3 + 2] = R;
			}
			// G通道
			G = a[j * 3 + 1];
			G = G + level;
			if (G > 255) {
				r[j * 3 + 1] = 255;
			}
			else if (G < 0) {
				r[j * 3 + 1] = 0;
			}
			else {
				r[j * 3 + 1] = G;
			}
			// B通道
			B = a[j * 3];
			B = B - level;
			if (B > 255) {
				r[j * 3] = 255;
			}
			else if (B < 0) {
				r[j * 3] = 0;
			}
			else {
				r[j * 3] = B;
			}
		}
	}
	return result;
}

C++测试代码

#include <iostream>  
#include <opencv2\\opencv.hpp>
#include <opencv2/highgui/highgui.hpp> 

using namespace cv;
using namespace std;

cv::Mat ColorTemperature(cv::Mat input, int percent);

int main() 
{
	cv::Mat src = imread("test4.jpg");
	int percent1 = 50;
	int percent2 = -50;
	cv::Mat result1 = ColorTemperature(src, percent1);
	cv::Mat result2 = ColorTemperature(src, percent2);
	imshow("original", src);
	imshow("result1", result1);
	imshow("result2", result2);
	waitKey();
	return 0;
}

// 色温调节
cv::Mat ColorTemperature(cv::Mat input, int percent)
{
	cv::Mat result = input.clone();
	int row = input.rows;
	int col = input.cols;
	int level = percent/2;
	for (int i = 0; i < row; ++i)
	{
		uchar* a = input.ptr<uchar>(i);
		uchar* r = result.ptr<uchar>(i);
		for (int j = 0; j < col; ++j)
		{
			int R,G,B;
			// R通道
			R = a[j * 3 + 2];
			R = R + level;
			if (R > 255) {
				r[j * 3 + 2] = 255;
			}
			else if (R < 0) {
				r[j * 3 + 2] = 0;
			}
			else {
				r[j * 3 + 2] = R;
			}
			// G通道
			G = a[j * 3 + 1];
			G = G + level;
			if (G > 255) {
				r[j * 3 + 1] = 255;
			}
			else if (G < 0) {
				r[j * 3 + 1] = 0;
			}
			else {
				r[j * 3 + 1] = G;
			}
			// B通道
			B = a[j * 3];
			B = B - level;
			if (B > 255) {
				r[j * 3] = 255;
			}
			else if (B < 0) {
				r[j * 3] = 0;
			}
			else {
				r[j * 3] = B;
			}
		}
	}
	return result;
}

测试效果

图1 原图
图2 percent为50的效果图
图3 percent为-50的效果图

       通过调整percent可以实现图像色温的调整。

       如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!


       最近看了一部很棒的灾难片——《峰爆》,推荐给大家。

 

以上是关于OpenCV-图像色温的主要内容,如果未能解决你的问题,请参考以下文章

IOS – OpenGL ES 调节图像白平衡/色温 GPUImageWhiteBalanceFilter

pyhton—opencv直线检测(HoughLines)找到最长的一条线

pyhton—opencv直线检测(HoughLines)找到最长的一条线

html5图片转canvas后调整色温、饱和度.

photoshop如何校正白平衡

图像3A算法详解