Color Transfer between Images code实现
上计算机视觉课老师布置的作业实现论文:Color Transfer between Images
基本思路是:
1.给定srcImg和targetImg
2.将RGB空间转为Lab空间
3.根据论文中公式:
计算每一个像素点
4.将resultImg转回到RGB空间显示
效果图:
见代码:
- #include <opencv2/opencv.hpp>
- #include <opencv2/core/core.hpp>
- #include <opencv2/imgproc/imgproc.hpp>
- #include <math.h>
- using namespace std;
- using namespace cv;
- class ColorTransfer
- {
- public:
- Mat resultImg;
- ColorTransfer(Mat src, Mat target)
- {
- src.convertTo(srcImg_32F, CV_32FC3,1.0f/.f);//这里切记要类型转换下
- target.convertTo(targetImg_32F, CV_32FC3, 1.0f/255.0f);
- resultImg = srcImg_32F; //将结果先初始化为源图像
- srcImg_Lab = RGBToLab(srcImg_32F);
- targetImg_Lab = RGBToLab(targetImg_32F);
- srcMeans = computeMeans(srcImg_Lab);
- targetMeans = computeMeans(targetImg_Lab);
- srcVariances = computeVariances(srcImg_Lab, srcMeans);
- targetVariances = computeVariances(targetImg_Lab, targetMeans);
- computeResult();
- }
- private:
- //读入的RGB图像
- Mat srcImg_32F;
- Mat targetImg_32F;
- //转换后的Lab空间图像
- Mat srcImg_Lab;
- Mat targetImg_Lab;
- //计算得到的均值和方差
- Vector<double> srcMeans;
- Vector<double> targetMeans;
- Vector<double> srcVariances;
- Vector<double> targetVariances;
- //RGB转换到Lab空间
- Mat RGBToLab(Mat m)
- {
- Mat_<Vec3f> I = m;
- for(int i=;i<I.rows;++i)
- {
- for(int j=;j<I.cols;++j)
- {
- double L = 0.3811*I(i,j)[] + 0.5783*I(i,j)[] + 0.0402*I(i,j)[];
- double M = 0.1967*I(i,j)[] + 0.7244*I(i,j)[] + 0.0782*I(i,j)[];
- double S = 0.0241*I(i,j)[] + 0.1288*I(i,j)[] + 0.8444*I(i,j)[];
- if(L == ) L = ;
- if(M == ) M = ;
- if(S == ) S = ;
- L = log(L);
- M = log(M);
- S = log(S);
- I(i,j)[] = (L+M+S) / sqrt(3.0);
- I(i,j)[] = (L+M-*S) / sqrt(6.0);
- I(i,j)[] = (L-M) / sqrt(2.0);
- }
- }
- return I;
- }
- //Lab转换到RGB空间
- Mat LabToRGB(Mat m)
- {
- Mat_<Vec3f> I = m;
- for(int i=;i<I.rows;++i)
- for(int j=;j<I.cols;++j)
- {
- double L = I(i,j)[]/sqrt(3.0) + I(i,j)[]/sqrt(6.0) + I(i,j)[]/sqrt(2.0);
- double M = I(i,j)[]/sqrt(3.0) + I(i,j)[]/sqrt(6.0) - I(i,j)[]/sqrt(2.0);
- double S = I(i,j)[]/sqrt(3.0) - *I(i,j)[]/sqrt(6.0);
- L = exp(L);
- M = exp(M);
- S = exp(S);
- I(i,j)[] = 4.4679*L - 3.5873*M + 0.1193*S;
- I(i,j)[] = -1.2186*L + 2.3809*M - 0.1624*S;
- I(i,j)[] = 0.0497*L - 0.2439*M + 1.2045*S;
- }
- return I;
- }
- Vector<double> computeMeans(Mat m)
- {
- double sum[] = { };
- int pixes = m.cols * m.rows;
- Vector<double> means;
- means.resize();
- Mat_<Vec3f> I = m;
- for(int i=;i<I.rows;++i)
- for(int j=;j<I.cols;++j)
- {
- for(int k = ;k < ;k++)
- {
- sum[k] += I(i,j)[k];
- }
- }
- for(int i = ;i < ;i++)
- {
- means[i] = sum[i] / pixes;
- }
- return means;
- }
- Vector<double> computeVariances(Mat m, Vector<double> means)
- {
- double sum[] = { };
- int pixes = m.cols * m.rows;
- Mat_<Vec3f> I = m;
- Vector<double> variances;
- variances.resize();
- for(int i=;i<I.rows;++i)
- for(int j=;j<I.cols;++j)
- {
- for(int chanel = ;chanel < ;chanel++)
- {
- sum[chanel] += abs(I(i,j)[chanel] - means[chanel]);
- }
- }
- for(int i = ;i < ;i++)
- {
- variances[i] = sqrt(sum[i] / pixes);
- }
- return variances;
- }
- void computeResult()
- {
- Mat_<Vec3f> I = resultImg;
- double dataTemp[] = { };
- for(int chanel =;chanel < ;chanel++)
- {
- dataTemp[chanel] = targetVariances[chanel] / srcVariances[chanel];
- }
- for(int i=;i<I.rows;++i)
- for(int j=;j<I.cols;++j)
- {
- for(int chanel = ;chanel < ;chanel++)
- {
- I(i,j)[chanel] = dataTemp[chanel] * (I(i,j)[chanel]-srcMeans[chanel]) + targetMeans[chanel];
- }
- }
- resultImg = LabToRGB(resultImg);
- }
- };
- int main()
- {
- Mat src = imread("11.jpg");
- namedWindow("src");
- imshow("src", src);
- Mat target = imread("12.jpg");
- namedWindow("target");
- imshow("target", target);
- ColorTransfer clt(src,target);
- namedWindow("result");
- imshow("result", clt.resultImg);
- Mat saveImg;
- clt.resultImg.convertTo(saveImg,CV_8U, 255.0, /255.0);//imwrite函数只支持8bit和16bit,前面将图像转为了float,保存前要转换
- imwrite("result.jpg",saveImg);
- waitKey();
- return ;
- }
Color Transfer between Images code实现的更多相关文章
- 快速 图片颜色转换迁移 Color Transfer Opencv + Python
Super fast color transfer between images About a month ago, I spent a morning down at the beach, w ...
- Maven-008-Nexus 私服部署发布报错 Failed to deploy artifacts: Failed to transfer file: ... Return code is: 4XX, ReasonPhrase: ... 解决方案
我在部署构件至 maven nexus 私服时,有时会出现 Failed to deploy artifacts: Failed to transfer file: ... Return code i ...
- QA:Failed to deploy artifacts from/to snapshots XX Failed to transfer file Return code is: 405, ReasonPhrase:Method Not Allowed.
QA: Failed to deploy artifacts from/to snapshots XX Failed to transfer file Return code is: 405, Rea ...
- Machine code transfer into assembly code
#include <stdio.h> const char shell[]="\x0f\x01\xf8\xe8\5\0\0\0\x0f\x01\xf8\x48\xcf" ...
- Visual Studio Code 如何编写运行 C、C++ 程序?
0. 前言 VS Code 是微软发布一款跨平台的源代码编辑器,其拥有强大的功能和丰富的扩展,使之能适合编写许多语言. 本文面向初学者(但不是纯小白),分享一点我配置C/C++的经验. 本文所有内容均 ...
- maven报错:Return code is: 501 , ReasonPhrase:HTTPS Required
今天把一个去年没做完的项目翻出来做时,发现maven无法正常导入依赖.检查了一遍项目配置,没发现有什么问题.而且依赖在本地仓库存在. 随后发现报错:Failed to transfer file:** ...
- RGB Color Codes Chart
RGB Color Codes Chart RGB颜色空间 RGB颜色空间或RGB颜色系统,从红色.绿色和蓝色的组合中构造所有颜色. 红色.绿色和蓝色各使用8位,它们的整数值从0到255.这使得256 ...
- {ICIP2014}{收录论文列表}
This article come from HEREARS-L1: Learning Tuesday 10:30–12:30; Oral Session; Room: Leonard de Vinc ...
- C#读取图片Exif信息
Exif是可交换图像文件的缩写,是专门为数码相机的照片设定的,可以记录数码照片的属性和拍摄数据 ////调用 //string strFile="fffff.jpg";//文件名 ...
随机推荐
- ubuntu环境下vmware取消自动启动服务
概述其实vmware这个服务取不取消,影响不大,主要是我有强迫症,在不用虚拟机的时候,看着vmware占着进程真心不爽,想要解决这个问题,在用虚拟机的时候启动服务,反之,则停.接下来,我说一下实现吧. ...
- 【转】Polya定理
转自:http://endlesscount.blog.163.com/blog/static/82119787201221324524202/ Polya定理 首先记Sn为有前n个正整数组成的集合, ...
- java基本类型的默认值及其取值范围
- apache 使用htaccess自定义路由机制
先开启伪静态.详情查看这篇文章:http://www.cnblogs.com/CyLee/p/5544119.html 然后在项目根目录中新建一个.htaccess文件,加入以下代码 正则中()的变量 ...
- 【转】ubuntu下最好用的输入法fcitx-sunpinyin
http://www.freetstar.com/index.php/ubuntu-most-use-friendly-fcitx-sunpinyin 今天难得折腾一会儿输入法,对于系统美化方面的 ...
- 微软开源.NET Core的执行引擎CoreCLR{转载}
继去年12月宣布.NET Core开源之后,微软拥抱开源的决心又向前迈了一步,Microsoft于昨日在 .NET Framework Blog上 宣布开源.NET Core 的执行引擎 CoreCL ...
- 资深人士剖析微软开源.NET事件:战略重心已经从PC转移到云端
本文是雷锋网对我的访谈整理的文章,源地址是 http://www.leiphone.com/news/201411/6KaGhD7PDABnvrRf.html 2014年11月13日,微软表示开源.N ...
- .NET支持多平台后的一点拙见
我们目前对.NET的理解大部分可以归纳为:起初它是Java平台(注意是平台,不要跟Java语言搞混淆)的一个克隆品,后来慢慢演变,有了自己的特性.由于Java平台最显著的特点就是“平台独立性”(或者说 ...
- XCode的个人使用经验
Xcode是强大的IDE(但个人觉得不如Visual Studio做得好),其强大功能无需本人再赘述,本文也不是一篇“快捷键列表”,因为XCode上的快捷键极其多,而且还有不少是需要同时按下四个按键的 ...
- 模糊测试(fuzz testing)介绍(一)
模糊测试(fuzz testing)是一类安全性测试的方法.说起安全性测试,大部分人头脑中浮现出的可能是一个标准的“黑客”场景:某个不修边幅.脸色苍白的年轻人,坐在黑暗的房间中,正在熟练地使用各种工具 ...