一种简单的色彩平衡算法的OPENCV实现

简介:

很久之前看过一篇关于色彩平衡文章,在该文章中介绍了一种非常简单高效的

色彩平衡算法。下图是算法的演示效果(左边为处理后的图像,右边为处理前的图像)。

从图中可以看出算法有效的改善的图像的色彩,使得色彩更加的真实。

 

 

下面是实现代码

 

 

#include "stdafx.h"

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"

#pragma comment(lib, "cv.lib")
#pragma comment(lib, "cxcore.lib")
#pragma comment(lib, "highgui.lib")

void color_balance(IplImage *img)
{
int histo[256] = {0};
int num_of_pixels = img->width*img->height;
for(int y = 0; y < img->height; ++y)
{
uchar *data = (uchar*)(img->imageData + y*img->widthStep);
for(int x = 0; x < img->width; ++x)
{
histo[data[x]] += 1;
}
}

for(int i = 1; i < 256; ++i)
histo[i] = histo[i] + histo[i-1];

double s = 0.1;
int vmin = 0;
while (histo[vmin + 1] <= cvRound(num_of_pixels*s/2))
vmin = vmin + 1;
int vmax = 255 - 1;
while( histo[vmax - 1] > cvRound(num_of_pixels*(1 - s/2)))
{
vmax = vmax - 1;
}
if (vmax < 255 - 1)
vmax = vmax + 1;

for(int y = 0; y < img->height; ++y)
{

uchar *data = (uchar*)(img->imageData + y*img->widthStep);
for(int x = 0; x < img->width; ++x)
{
if(data[x] < vmin)
data[x] = vmin;
if(data[x] > vmax)
data[x] = vmax;
}
}

for(int y = 0; y < img->height; ++y)
{

uchar *data = (uchar*)(img->imageData + y*img->widthStep);
for(int x = 0; x < img->width; ++x)
{
data[x] = cvRound((data[x] - vmin)*255.0/(vmax - vmin));
}
}

}
int _tmain(int argc, _TCHAR* argv[])
{
IplImage *srcImg = cvLoadImage("D:\\colorbalance.jpg");
IplImage *dstImg = cvCreateImage(cvGetSize(srcImg), 8, 3);
IplImage *redCh = cvCreateImage(cvGetSize(srcImg), 8, 1);
IplImage *greenCh = cvCreateImage(cvGetSize(srcImg), 8, 1);
IplImage *blueCh = cvCreateImage(cvGetSize(srcImg), 8, 1);
cvSplit(srcImg, blueCh, greenCh, redCh, NULL);
color_balance(redCh);
color_balance(greenCh);
color_balance(blueCh);
cvMerge(blueCh, greenCh, redCh, NULL, dstImg);

cvNamedWindow("src", CV_WINDOW_AUTOSIZE);
cvShowImage("src", srcImg);

cvNamedWindow("dst", CV_WINDOW_AUTOSIZE);
cvShowImage("dst", dstImg);
cvWaitKey(0);

return 0;
}

本文转自博客园知识天地的博客,原文链接:一种简单的色彩平衡算法的OPENCV实现,如需转载请自行联系原博主。


相关文章
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
479 0
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
3801 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
机器学习/深度学习 算法 计算机视觉
基于opencv的SVM算法的车牌识别系统设计与实现
基于opencv的SVM算法的车牌识别系统设计与实现
526 3
基于opencv的SVM算法的车牌识别系统设计与实现
|
存储 缓存 算法
时间&空间复杂度,Python 算法的双重考验!如何优雅地平衡两者,打造极致性能?
【7月更文挑战第23天】在Python算法设计中,时间与空间复杂度是关键考量,需精妙平衡以优化程序性能。时间复杂度反映算法随输入规模增长的执行时间趋势,空间复杂度关注额外存储需求。线性搜索O(n)时间,O(1)空间;二分搜索O(log n)时间,O(1)空间,提升效率;动态规划如斐波那契数列O(n)时间与空间,利用存储减小计算。实际应用需按场景需求调整,如实时数据偏重时间,资源受限环境优先考虑空间。平衡两者,理解算法本质,结合实践,创造高性能程序。
218 7
|
计算机视觉
OpenCV图像色彩空间转换
OpenCV图像色彩空间转换
|
算法 计算机视觉
【OpenCV】- 分水岭算法
【OpenCV】- 分水岭算法
244 2
|
移动开发 算法 计算机视觉
技术笔记:openCV特征点识别与findHomography算法过滤
技术笔记:openCV特征点识别与findHomography算法过滤
432 0
|
机器学习/深度学习 编译器 算法框架/工具
OpenCV算法库
numba是一个用于编译Python数组和数值计算函数的编译器,这个编译器能够大幅提高直接使用Python编写的函数的运算速度。
|
算法
数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)
数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)
721 0
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
917 0

热门文章

最新文章