上计算机视觉课老师布置的作业实现论文:Color Transfer between Images

基本思路是:

1.给定srcImg和targetImg

2.将RGB空间转为Lab空间

3.根据论文中公式:

计算每一个像素点

4.将resultImg转回到RGB空间显示

效果图:

  

  

见代码:

  1. #include <opencv2/opencv.hpp>
  2. #include <opencv2/core/core.hpp>
  3. #include <opencv2/imgproc/imgproc.hpp>
  4. #include <math.h>
  5. using namespace std;
  6. using namespace cv;
  7.  
  8. class ColorTransfer
  9. {
  10. public:
  11. Mat resultImg;
  12.  
  13. ColorTransfer(Mat src, Mat target)
  14. {
  15. src.convertTo(srcImg_32F, CV_32FC3,1.0f/.f);//这里切记要类型转换下
  16. target.convertTo(targetImg_32F, CV_32FC3, 1.0f/255.0f);
  17. resultImg = srcImg_32F; //将结果先初始化为源图像
  18.  
  19. srcImg_Lab = RGBToLab(srcImg_32F);
  20. targetImg_Lab = RGBToLab(targetImg_32F);
  21. srcMeans = computeMeans(srcImg_Lab);
  22. targetMeans = computeMeans(targetImg_Lab);
  23. srcVariances = computeVariances(srcImg_Lab, srcMeans);
  24. targetVariances = computeVariances(targetImg_Lab, targetMeans);
  25. computeResult();
  26. }
  27.  
  28. private:
  29. //读入的RGB图像
  30. Mat srcImg_32F;
  31. Mat targetImg_32F;
  32. //转换后的Lab空间图像
  33. Mat srcImg_Lab;
  34. Mat targetImg_Lab;
  35. //计算得到的均值和方差
  36. Vector<double> srcMeans;
  37. Vector<double> targetMeans;
  38. Vector<double> srcVariances;
  39. Vector<double> targetVariances;
  40.  
  41. //RGB转换到Lab空间
  42. Mat RGBToLab(Mat m)
  43. {
  44. Mat_<Vec3f> I = m;
  45. for(int i=;i<I.rows;++i)
  46. {
  47. for(int j=;j<I.cols;++j)
  48. {
  49. double L = 0.3811*I(i,j)[] + 0.5783*I(i,j)[] + 0.0402*I(i,j)[];
  50. double M = 0.1967*I(i,j)[] + 0.7244*I(i,j)[] + 0.0782*I(i,j)[];
  51. double S = 0.0241*I(i,j)[] + 0.1288*I(i,j)[] + 0.8444*I(i,j)[];
  52. if(L == ) L = ;
  53. if(M == ) M = ;
  54. if(S == ) S = ;
  55. L = log(L);
  56. M = log(M);
  57. S = log(S);
  58.  
  59. I(i,j)[] = (L+M+S) / sqrt(3.0);
  60. I(i,j)[] = (L+M-*S) / sqrt(6.0);
  61. I(i,j)[] = (L-M) / sqrt(2.0);
  62. }
  63. }
  64.  
  65. return I;
  66. }
  67.  
  68. //Lab转换到RGB空间
  69. Mat LabToRGB(Mat m)
  70. {
  71. Mat_<Vec3f> I = m;
  72. for(int i=;i<I.rows;++i)
  73. for(int j=;j<I.cols;++j)
  74. {
  75. double L = I(i,j)[]/sqrt(3.0) + I(i,j)[]/sqrt(6.0) + I(i,j)[]/sqrt(2.0);
  76. double M = I(i,j)[]/sqrt(3.0) + I(i,j)[]/sqrt(6.0) - I(i,j)[]/sqrt(2.0);
  77. double S = I(i,j)[]/sqrt(3.0) - *I(i,j)[]/sqrt(6.0);
  78.  
  79. L = exp(L);
  80. M = exp(M);
  81. S = exp(S);
  82.  
  83. I(i,j)[] = 4.4679*L - 3.5873*M + 0.1193*S;
  84. I(i,j)[] = -1.2186*L + 2.3809*M - 0.1624*S;
  85. I(i,j)[] = 0.0497*L - 0.2439*M + 1.2045*S;
  86. }
  87.  
  88. return I;
  89. }
  90.  
  91. Vector<double> computeMeans(Mat m)
  92. {
  93. double sum[] = { };
  94. int pixes = m.cols * m.rows;
  95. Vector<double> means;
  96. means.resize();
  97. Mat_<Vec3f> I = m;
  98.  
  99. for(int i=;i<I.rows;++i)
  100. for(int j=;j<I.cols;++j)
  101. {
  102. for(int k = ;k < ;k++)
  103. {
  104. sum[k] += I(i,j)[k];
  105. }
  106. }
  107.  
  108. for(int i = ;i < ;i++)
  109. {
  110. means[i] = sum[i] / pixes;
  111. }
  112.  
  113. return means;
  114. }
  115.  
  116. Vector<double> computeVariances(Mat m, Vector<double> means)
  117. {
  118. double sum[] = { };
  119. int pixes = m.cols * m.rows;
  120. Mat_<Vec3f> I = m;
  121. Vector<double> variances;
  122. variances.resize();
  123.  
  124. for(int i=;i<I.rows;++i)
  125. for(int j=;j<I.cols;++j)
  126. {
  127. for(int chanel = ;chanel < ;chanel++)
  128. {
  129. sum[chanel] += abs(I(i,j)[chanel] - means[chanel]);
  130. }
  131. }
  132.  
  133. for(int i = ;i < ;i++)
  134. {
  135. variances[i] = sqrt(sum[i] / pixes);
  136. }
  137.  
  138. return variances;
  139. }
  140.  
  141. void computeResult()
  142. {
  143. Mat_<Vec3f> I = resultImg;
  144. double dataTemp[] = { };
  145.  
  146. for(int chanel =;chanel < ;chanel++)
  147. {
  148. dataTemp[chanel] = targetVariances[chanel] / srcVariances[chanel];
  149. }
  150.  
  151. for(int i=;i<I.rows;++i)
  152. for(int j=;j<I.cols;++j)
  153. {
  154. for(int chanel = ;chanel < ;chanel++)
  155. {
  156. I(i,j)[chanel] = dataTemp[chanel] * (I(i,j)[chanel]-srcMeans[chanel]) + targetMeans[chanel];
  157. }
  158. }
  159. resultImg = LabToRGB(resultImg);
  160. }
  161. };
  162.  
  163. int main()
  164. {
  165. Mat src = imread("11.jpg");
  166. namedWindow("src");
  167. imshow("src", src);
  168. Mat target = imread("12.jpg");
  169. namedWindow("target");
  170. imshow("target", target);
  171. ColorTransfer clt(src,target);
  172. namedWindow("result");
  173. imshow("result", clt.resultImg);
  174. Mat saveImg;
  175. clt.resultImg.convertTo(saveImg,CV_8U, 255.0, /255.0);//imwrite函数只支持8bit16bit,前面将图像转为了float,保存前要转换
  176. imwrite("result.jpg",saveImg);
  177.  
  178. waitKey();
  179. return ;
  180. }

Color Transfer between Images code实现的更多相关文章

  1. 快速 图片颜色转换迁移 Color Transfer Opencv + Python

      Super fast color transfer between images About a month ago, I spent a morning down at the beach, w ...

  2. 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 ...

  3. 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 ...

  4. 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" ...

  5. Visual Studio Code 如何编写运行 C、C++ 程序?

    0. 前言 VS Code 是微软发布一款跨平台的源代码编辑器,其拥有强大的功能和丰富的扩展,使之能适合编写许多语言. 本文面向初学者(但不是纯小白),分享一点我配置C/C++的经验. 本文所有内容均 ...

  6. maven报错:Return code is: 501 , ReasonPhrase:HTTPS Required

    今天把一个去年没做完的项目翻出来做时,发现maven无法正常导入依赖.检查了一遍项目配置,没发现有什么问题.而且依赖在本地仓库存在. 随后发现报错:Failed to transfer file:** ...

  7. RGB Color Codes Chart

    RGB Color Codes Chart RGB颜色空间 RGB颜色空间或RGB颜色系统,从红色.绿色和蓝色的组合中构造所有颜色. 红色.绿色和蓝色各使用8位,它们的整数值从0到255.这使得256 ...

  8. {ICIP2014}{收录论文列表}

    This article come from HEREARS-L1: Learning Tuesday 10:30–12:30; Oral Session; Room: Leonard de Vinc ...

  9. C#读取图片Exif信息

    Exif是可交换图像文件的缩写,是专门为数码相机的照片设定的,可以记录数码照片的属性和拍摄数据 ////调用 //string strFile="fffff.jpg";//文件名 ...

随机推荐

  1. ubuntu环境下vmware取消自动启动服务

    概述其实vmware这个服务取不取消,影响不大,主要是我有强迫症,在不用虚拟机的时候,看着vmware占着进程真心不爽,想要解决这个问题,在用虚拟机的时候启动服务,反之,则停.接下来,我说一下实现吧. ...

  2. 【转】Polya定理

    转自:http://endlesscount.blog.163.com/blog/static/82119787201221324524202/ Polya定理 首先记Sn为有前n个正整数组成的集合, ...

  3. java基本类型的默认值及其取值范围

  4. apache 使用htaccess自定义路由机制

    先开启伪静态.详情查看这篇文章:http://www.cnblogs.com/CyLee/p/5544119.html 然后在项目根目录中新建一个.htaccess文件,加入以下代码 正则中()的变量 ...

  5. 【转】ubuntu下最好用的输入法fcitx-sunpinyin

      http://www.freetstar.com/index.php/ubuntu-most-use-friendly-fcitx-sunpinyin 今天难得折腾一会儿输入法,对于系统美化方面的 ...

  6. 微软开源.NET Core的执行引擎CoreCLR{转载}

    继去年12月宣布.NET Core开源之后,微软拥抱开源的决心又向前迈了一步,Microsoft于昨日在 .NET Framework Blog上 宣布开源.NET Core 的执行引擎 CoreCL ...

  7. 资深人士剖析微软开源.NET事件:战略重心已经从PC转移到云端

    本文是雷锋网对我的访谈整理的文章,源地址是 http://www.leiphone.com/news/201411/6KaGhD7PDABnvrRf.html 2014年11月13日,微软表示开源.N ...

  8. .NET支持多平台后的一点拙见

    我们目前对.NET的理解大部分可以归纳为:起初它是Java平台(注意是平台,不要跟Java语言搞混淆)的一个克隆品,后来慢慢演变,有了自己的特性.由于Java平台最显著的特点就是“平台独立性”(或者说 ...

  9. XCode的个人使用经验

    Xcode是强大的IDE(但个人觉得不如Visual Studio做得好),其强大功能无需本人再赘述,本文也不是一篇“快捷键列表”,因为XCode上的快捷键极其多,而且还有不少是需要同时按下四个按键的 ...

  10. 模糊测试(fuzz testing)介绍(一)

    模糊测试(fuzz testing)是一类安全性测试的方法.说起安全性测试,大部分人头脑中浮现出的可能是一个标准的“黑客”场景:某个不修边幅.脸色苍白的年轻人,坐在黑暗的房间中,正在熟练地使用各种工具 ...