目录

0 说明

1 效果

2 代码实现

2.1 我的实现

2.2 其他方法


0 说明

目前很多摄像头特别是网络摄像头对色彩的处理情况存在色差,比如一个橙子(是黄色的),但是拍出来的效果会泛白,有点像梨子的颜色,因此要用到色彩校正。

一般色彩校正使用白平衡,白平衡一般又分为:灰世界、完美反射、等,这里不做具体陈述。

此处提供了一种方法,总体原理为(对每个通道而言):

1)对偏暗和偏亮的颜色进行特定的处理:指定一个特定的像素值;

2)对其他像素值进行小幅度拉伸;

3)最后三个通道合并即为最终结果。

注意:偏暗和偏亮得界限是不对称的,可以同通过改变代码中的s实现。

具体计算方式可以看源码(c语言实现,非c++)。

1 效果

2 代码实现

2.1 我的实现

调整参数s以符合自己效果

/*
对偏暗和偏亮的的像素进行处理,对其他像素进行拉伸
偏暗和偏亮的判定可以通过调整下面的s进行调整,注意偏暗和偏亮是不对称的
*/
#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>using namespace cv;
using namespace std;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.0265;//此参数可以调整,最好在0.1以下(0=<s<=1)int vmin = 0;//统计像素点数目小于num_of_pixels*s / 2的数目,s为控制比率while (histo[vmin + 1] <= cvRound(num_of_pixels*s / 2))vmin = vmin + 1;int vmax = 255 - 1;//统计像素点数目大于num_of_pixels*(1 - s / 2)的数目,s为控制比率while (histo[vmax - 1] > cvRound(num_of_pixels*(1 - s / 2))){vmax = vmax - 1;}if (vmax < 255 - 1)vmax = vmax + 1;//处理图像中像素值大于vmin和小于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){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 main()
{IplImage *srcImg = cvLoadImage("02.jpg");//读取图片IplImage *dstImg = cvCreateImage(cvGetSize(srcImg), 8, 3);IplImage *redCh = cvCreateImage(cvGetSize(srcImg), 8, 1);//R通道IplImage *greenCh = cvCreateImage(cvGetSize(srcImg), 8, 1);//G通道IplImage *blueCh = cvCreateImage(cvGetSize(srcImg), 8, 1);//B通道cvSplit(srcImg, blueCh, greenCh, redCh, NULL);//把原图拆分RGB通道color_balance(redCh);//对R通道进行色彩平衡color_balance(greenCh);//对G通道进行色彩平衡color_balance(blueCh);//对B通道进行色彩平衡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;
}

2.2 其他方法

灰世界--->这个代码对有些情况下效果不好

#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>using namespace cv;int main()
{Mat imageSource = imread("02.jpg");imshow("原始图像", imageSource);vector<Mat> imageRGB;//RGB三通道分离split(imageSource, imageRGB);//求原始图像的RGB分量的均值double R, G, B;B = mean(imageRGB[0])[0];G = mean(imageRGB[1])[0];R = mean(imageRGB[2])[0];//需要调整的RGB分量的增益double KR, KG, KB;KB = (R + G + B) / (3 * B);KG = (R + G + B) / (3 * G);KR = (R + G + B) / (3 * R);//调整RGB三个通道各自的值imageRGB[0] = imageRGB[0] * KB;imageRGB[1] = imageRGB[1] * KG;imageRGB[2] = imageRGB[2] * KR;//RGB三通道图像合并merge(imageRGB, imageSource);imshow("白平衡调整后", imageSource);waitKey();return 0;
}

opencv实现色彩还原(白平衡)相关推荐

  1. OpenCV每日函数 白平衡相关算法

    一.概述 OpenCV中其他照片处理算法模块提供了三种白平衡算法,基于WhiteBalancer类, 原图 1.灰度世界算法 该算法基于灰色世界假设来缩放像素值,该假设指出所有通道的平均值应产生灰色图 ...

  2. opencv 白平衡

    这个可以参考: https://blog.csdn.net/weixin_43379058/article/details/88606961 OpenCV 图像白平衡算法(相机自动白平衡) 彩色相机内 ...

  3. opencv 白平衡之灰度世界算法

    简述 OpenCV对图像进行处理时,有时图像RGB受光照影响比较严重,转换到HSV等空间也解决不了时,可以用白平衡算法进行修正,使其发黄.发蓝.发红的照片更加趋于自然光下的图像. 白平衡算法有很多种, ...

  4. 基于opencv的 SNR,GAMMA,色差,饱和度,曝光误差,白平衡误差的自动化算法开发

    imatest利用24色卡colorchecker模块计算SNR,GAMMA,色差,饱和度,曝光误差,白平衡误差. 1.SNR SNR主要计算中心灰的最大最小信号差与标准差的比值,用来表征信噪比,当时 ...

  5. 图像光照校正处理(白平衡)及其速度优化 -opencv+python

    https://github.com/18150167970/image_process_tool/blob/master/lighting_enhancement.py 先上效果图,从上到下分别为 ...

  6. python opencv白平衡算法

    最近学习白平衡,看了一些方法,把学习过程中的算法记录下来,后续继续学习. 灰度世界.完美反射,动态阈值算法等图像算法,但都没有找到适合所有偏色类型的算法.总结:这些单纯的图像识别算法不太好,还是多看用 ...

  7. 摄影师为你解释自定义白平衡与准确的色彩还原

    问:我们这里的广场照明条件特别好,举行一些仪式的时候,亮的跟白天一样.可是为什么我拍出来的照片,白平衡怎么调节颜色都是怪怪的,特别是红色根本就表现不出来.色温和自定义白平衡我都去调节了,一点用都没有. ...

  8. Java OpenCV 图像白平衡算法

    原文链接:https://blog.csdn.net/dcrmg/article/details/53545510         彩色相机内部有三个CCD电子耦合元件,分别用来感受红绿蓝三中颜色的光 ...

  9. OpenCV读写视频文件解析(二)

    OpenCV读写视频文件解析(二) VideoCapture::set 设置视频捕获中的属性. C++: bool VideoCapture::set(int propId, double value ...

最新文章

  1. 国际互联网协会(ISOC)提出未来互联网十项原则
  2. 2、.net NVelocity中原生javascript ajax封装使用
  3. AttributeError系列之:AttributeError: 'tuple' object has no attribute 'shape'
  4. 用算法“脱掉”女性衣服,这款AI应用被迫下架后再被全网封杀
  5. matlab求灰度图像梯度,[求助]如何求图像的梯度
  6. 基于java的qq屏幕截图工具的设计与实现_几款鲜为人知的实用工具,你都尝试过吗?...
  7. 王者荣耀女性机器人面世;深圳中院受理金立破产案;Firefox 64 发布 | 极客头条...
  8. [渝粤教育] 武汉理工大学 模拟电子技术基础 参考 资料
  9. 151003有道扇贝每日一句
  10. 微星小飞机界面翻译_/|黑科技高效快捷的多引擎翻译软件
  11. 计算机组成原理 - 基本概念
  12. php libiconv close_无法编译PHP undefined reference to `libiconv_open
  13. nRF24L01无线通信模块使用简介
  14. 【PAT刷题甲级】部分笔记1065-1155~(下)
  15. org.apache.jasper.JasperException: /app/jsonp.jsp(1,2) Page-encoding specified in jsp-property-grou
  16. 全球霸榜的Dell EMC VxRail,靠什么赢得超融合客户认可?
  17. 贝叶斯公式的对数似然函数_最大似然法与似然函数
  18. UVA - 10118 Free Candies 记忆化搜索
  19. php xmp,在jpeg中编写XMP元数据(使用PHP) – 使用单个或多个rdf:描述块
  20. 【EmguCV】EmguCV各种调用

热门文章

  1. php登陆网页版微信代码,几行php代码实现微信自动注册登陆 (微信PC扫码受权登陆注册)...
  2. Crontab中的除号(slash)到底怎么用?
  3. 怎么免卸载升级太极中的软件
  4. java word模版填充_Java 数据填充到word模板中
  5. java实现word模板文件填充
  6. 使用TS开发小程序中遇到的问题
  7. 机器学习实战——人脸表情识别
  8. 【ZZULIOJ】1026: 字符类型判断
  9. React + Redux + Express + Mongodb 零基础开发完整大型商城网站视频教程(97 个视频)
  10. 大学生PHP简单网站制作方法 学生PHP网站作业 动态PHP毕业设计 PHP MYSQL在线留言板网站源码