编者按:今年OpenCV收到了很多来自中国的贡献,比如DNN的ARM后端Tengine、基于深度学习的文本检测识别、对RISC-V的支持等新功能。在即将发布的4.5.1版本,华为开源能力中心的工程师又为OpenCV贡献了一个重要功能 -- 色彩校正。

作者:张金衡、单晨琪、王龙步 (华为开源能力中心)

本文将介绍CV领域一个重要应用 -- 色彩校正。该模块收录在 opencv_contrib/modules/mcc 模块中,由 PR #2671 贡献。

色彩校正简介

一般来说,由于拍摄设备、光线环境等客观因素,或者拍摄者喜好等主观因素影响,人们拍摄到的图片与真实物体的色彩会有一定的偏差。同一个事物在不同的环境下得到的图片颜色是不同的,这样就对接下来进行的图片处理、比较造成了一定影响。色彩校正技术就是为解决这个问题而提出的。

色彩校正(color calibration),通俗来说,就是使图片还原事物本身的颜色,也就是尽可能接近拍摄时人眼看所看到的事物。如今,色彩校正已经不仅在摄影中使用,而是在影视制作、游戏、医疗、建筑等各行各业中广泛使用。

需要注意的是,色彩校正与调色是不同的概念。前者是在图片中使事物的色彩重现,必须遵循一定的标准,不具有随意性,需要一些技术手段实现;后者则是人们对图片色彩的主观喜好而为,不需要遵循任何标准,具有随意性,是艺术性的实现。

从技术上来说,色彩校正[1]的目的是调整输入输出设备的颜色响应到已知状态。被校准的设备有时被称为校准源 ; 用作标准的色彩空间有时也称为校准目标。由于输入输出设备的制造工艺等,其通道响应存在非线性失真,为了校正该设备输出的图片,必须将其捕捉到的色彩与实际色彩进行校正。

色彩校正通常分成2个步骤:

  • 一是先将输入色彩空间线性化为与亮度成正比。这个过程是不适定问题[2],因此有许多不同的解决方案;

  • 二是做线性变换,把色彩空间变成绝对RGB色彩空间。所用的线性变换的矩阵称为色彩变换矩阵(color correction matrix,CCM),也称为CCM矩阵。CCM矩阵需要通过非线性优化来求解。

通常使用的校准色彩叫做色卡(colorchecker),最著名的是麦克白色卡(Macbeth ColorChecker)。色卡提供色彩校正中的参考色,所有的颜色都已经被标定。最流行的标准色卡是 Macbeth色卡,如下图所示。它包括4*6个色块,其中,最后一行的色块是灰色色块,可以用于灰度线性化或是白平衡。

Macbeth色卡

色彩校正的详细理论可查阅以下链接:

https://github.com/riskiest/color_calibration/tree/v4/doc/pdf/English/Algorithm

在OpenCV中使用色彩校正

在对 OpenCV 进行 building 时,运行以下命令来 build 所有 opencv_contrib 模块

cmake -D OPENCV_EXTRA_MODULES_PATH=/modules/

或者仅 build 色彩校正所在的 mcc 模块

cmake -D OPENCV_EXTRA_MODULES_PATH=/modules/mcc

若使用 cmake-gui(CMake的GUI版本)进行构建,需要检查确认包含 mcc 模块。

opencv_contrib/modules/mcc 模块主要包含两个部分,

  • 其一是 color checker detector 模型,具体说明可参考

    https://github.com/opencv/opencv_contrib/blob/master/modules/mcc/tutorials/basic_chart_detection/basic_chart_detection.markdown;

  • 其二为本文主要介绍的色彩校正模块。

色彩校正模块的核心类 -- ColorCorrectionModel:

声明:

opencv_contrib/modules/mcc/include/opencv2/mcc/ccm.hpp

定义:

opencv_contrib/modules/mcc/src/ccm.cpp

ColorCorrectionModel 的参数说明如下:

    src :            检测到 ColorChecker 色块的颜色(颜色类型是RGB而不是BGR,颜色值在[0, 1]范围内);    constcolor :            内置色卡,包括Macbeth、Vinyl、DigitalSG    Mat colors :           参考颜色值(颜色值在[0, 1]范围内);    ref_cs :           对应颜色值的色彩空间。如果颜色类型是RGB类型,则颜色格式是RGB而不是BGR;    支持的色彩空间有:RGB色彩空间(如COLOR_SPACE_sRGB)、线性RGB色彩空间(如COLOR_SPACE_sRGBL)、非RGB色彩空间(如COLOR_SPACE_Lab_D50_2)等。

在本文中,以 samples/color_correction_model.cpp 的示例作为参考,提取关键步骤代码形成如下程序:

#include #include #include using namespace std;using namespace cv;using namespace mcc;using namespace ccm;int main(int argc, char *argv[]){   // [get_messages_of_image]:获取图像消息   string filepath = "input.png"; // 输入图片路径   Mat image = imread(filepath, IMREAD_COLOR);   Mat imageCopy = image.clone();   Ptr detector = CCheckerDetector::create();// [get_color_checker]:准备ColorChecker检测vector> checkers = detector->getListColorChecker();for (Ptr<:cchecker> checker : checkers)   {// [create]:创建CCheckerDetector对象,并使用getListColorChecker函数获取ColorChecker信息。       Ptr cdraw = CCheckerDraw::create(checker);       cdraw->draw(image);       Mat chartsRGB = checker->getChartsRGB();       Mat src = chartsRGB.col(1).clone().reshape(3, chartsRGB.rows/3);       src /= 255.0;// [get_ccm_Matrix]:对于每个ColorChecker,都可以计算一个ccm矩阵以进行颜色校正。Model1是ColorCorrectionModel类的对象,可以根据需要来修改参数以获得最佳色彩校正效果。ColorCorrectionModel model1(src, COLORCHECKER_Vinyl);       model1.run();       Mat ccm = model1.getCCM();std::cout<<"ccm "<std::endl;double loss = model1.getLoss();std::cout<<"loss "<std::endl;// [make_color_correction]:成员函数infer_image用于使用ccm矩阵进行校正校正。       Mat img_;       cvtColor(image, img_, COLOR_BGR2RGB);       img_.convertTo(img_, CV_64F);const int inp_size = 255;const int out_size = 255;       img_ = img_ / inp_size;       Mat calibratedImage= model1.infer(img_);       Mat out_ = calibratedImage * out_size;// [Save_calibrated_image]:保存已校准的图像。       out_.convertTo(out_, CV_8UC3);       Mat img_out = min(max(out_, 0), out_size);       Mat out_img;       cvtColor(img_out, out_img, COLOR_RGB2BGR);       imwrite("output.png",out_img);   }return 0;}

运行上述代码所在文件,即可完成对于 input.png 图片的色彩校正,校正后的图片为 output.png。

下面展示一组通过本文介绍的色彩校正模块校正前后示例图。通过示例可以看出,原图拍摄色彩较暗,色卡颜色未显示其本身颜色,地板颜色偏暗,毛巾颜色偏蓝;校正后的图片则很好地还原了色卡和物体本身的颜色。

参考文献

  1. https://en.wikipedia.org/wiki/Color_correction

  2. Bianco, S., Bruna, A.R., Naccari, F., Schettini, R.: Color correction pipeline optimization for digital cameras. J. Electron. Imaging 22(2), 023014:1–023014:10 (2013)


OpenCV中国团队官方推荐和认证OpenCV在线课程

opencv 光线影响_在OpenCV中使用色彩校正相关推荐

  1. python opencv创建图像_使用Python中OpenCV库创建一幅图片的RGB通道图片

    我们知道,在使用PhotoShop进行图片的抠取.创建和存储选区.存储图像的色彩资料等复杂操作时,经常会用到一个功能,那就是"RGB"通道,它能从三原色角度对一幅图片进行精准处理. ...

  2. opencv 检测几何图形_使用OpenCV + ConvNets检测几何形状

    opencv 检测几何图形 A simple yet powerful pipeline for detecting shapes in scanned documents 一个简单而强大的管道,用于 ...

  3. python opencv 图像切割_【OpenCV+Python】图像的基本操作与算术运算

    图像的基本操作 在上个教程中,我们介绍了使用鼠标画笔的功能.本次教程,我们将要谈及OpenCV图像处理的基本操作. 本次教程的所有操作基本上都和Numpy相关,而不是与OpenCV相关.要使用Open ...

  4. opencv物品定位_使用OpenCV获取零件位置的学习笔记

    最近公司接到一个案子,使用移动机械臂抓取圆盘上下料,目前我们的移动机器人定位精度在两厘米左右,因此需要视觉辅助定位来提高夹取的精度. 这个项目本身不是我做,出于对是视觉的兴趣,学习了一下如何使用Ope ...

  5. opencv 轮廓放大_使用OpenCV和Python构建自己的车辆检测模型

    总览 对智慧城市的想法感到兴奋吗? 您会喜欢本教程,内容是构建自己的车辆检测系统. 首先,我们将了解如何在视频中检测运动物体,然后再进入实践部分. 介绍 我喜欢智慧城市的想法.关于自动化智能能源系统, ...

  6. opencv 识别长方形_利用opencv识别并提取图片中的矩形

    这次是利用opencv来识别图片中的矩形. 其中遇到的问题主要是识别轮廓时矩形内部的形状导致轮廓不闭合. 过程如下: **1. 对输入灰度图片进行高斯滤波 2. 做灰度直方图,提取阈值,做二值化处理 ...

  7. opencv 识别长方形_使用OpenCV检测图像中的矩形

    本文实例为大家分享了OpenCV检测图像中矩形的具体代码,供大家参考,具体内容如下 前言 1.OpenCV没有内置的矩形检测的函数,如果想检测矩形,要自己去实现. 2.我这里使用的OpenCV版本是3 ...

  8. opencv 识别长方形_利用OpenCV检测图像中的长方形画布或纸张并提取图像内容

    问题如下: 也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?这是个很常见的场景,比如在博物馆里看到一幅很喜欢的画,用手机找了下来, ...

  9. opencv光线补偿_教你了解摄像机的背光补偿

    原标题:教你了解摄像机的背光补偿 背光补偿,也称为逆光补偿,那么到底什么是背光补偿?背光补偿的概念是什么呢,下面小编为大家详细的介绍,背光补偿也称作逆光补偿或逆光补正,它可以有效补偿摄像机在逆光环境下 ...

最新文章

  1. 【.Net Micro Framework PortingKit – 14】TinyCLR编译与测试
  2. linux怎么创建vi脚本,Vim 创建Python脚本时候自动补全解释器和编码方法
  3. Arch Linux中安装Anaconda
  4. python高级应用_Python高级编程技巧
  5. 封装 axios 请求
  6. LeetCode算法入门- Search Insert Position -day19
  7. 微软MVC对架构的一点思考
  8. 支付宝信用卡还款也开始收费了!但还是比微信便宜2元...
  9. asp.net中涉及子文件夹的母版页和相对路径文件引用问题(一)
  10. 数据库连接池的实现方法(MySQL+C++)
  11. 一个专为推荐系统定制的BERT!
  12. html to pdf
  13. 如何使用qtp检查网页中显示的文字颜色为指定的颜色
  14. pads中如何设置等长_如何给PDF中的文本设置高亮显示
  15. 基于python下django框架 实现旅游景区景点售票系统详细设计
  16. 马尔可夫链模型的信贷风险分析与预测
  17. Windows XP的图标结构
  18. 视频教程-项目经理俱乐部-项目实战.职场求生.敏捷.企业管理-敏捷开发
  19. Android +kotlin Banner 轮播广告 获取后台数据
  20. Latex第一次写论文记录

热门文章

  1. python的sorted排序具体解释
  2. LuoguP1041 传染病控制
  3. 深入理解PHP之foreach
  4. java多线程02-----------------synchronized底层实现及JVM对synchronized的优化
  5. python 简介+安装(搬运廖雪峰网站)
  6. linux 如何连通网络
  7. Alfred Remote初体验
  8. 连接Oracle9i,因字符集造成乱码的解决方法
  9. [转载] 五、字符串类的实现及子串查找算法
  10. [BZOJ2440][中山市选2011]完全平方数(莫比乌斯函数,二分)