如何使用OpenCV重新着色照片?

时间:2017-07-08 23:28:29

标签: opencv image-processing colors

我有一张灰度照片,我正在尝试以编程方式进行着色,以便它看起来真实,并且用户输入'绘画'颜色(例如红色)。感觉它应该很简单,但是我一直在尝试一些看起来不正确的方法,所以我想我会问社区,以防我错过了一些明显的东西。我尝试了以下

  • 转换为HSV,并结合" Hue"和用户选择的颜色饱和度,使用"值"从图像。 enter image description here
  • 构建颜色转换矩阵以乘以BGR值(即R = 0.8R + 1.1G + 1.0B)。这适用于着色&​​#39;,并添加了一个很好的柔和效果,但并没有真正保持我想要的颜色的深度或大胆。
  • (最喜欢到目前为止 - 请参阅答案)将颜色通道中的RGB乘以RGB图像。Multiply - left colour channel, middle value, right combination

2 个答案:

答案 0 :(得分:0)

要添加用户Alexander Reynolds的评论,您提出的问题是计算机图形领域中一个已知的开放研究问题,因为如果不使用某种统计先验,问题就会受到限制。 CG社区的最新技术现已在SIGGRAPH 2016上展示。

http://hi.cs.waseda.ac.jp/~iizuka/projects/colorization/en/

另见: http://richzhang.github.io/colorization/

答案 1 :(得分:0)

我有另一个想法和玩photoshop,并在BGR空间上实现了一个多重混合模式,以获得一个好的结果。 在java中实现

Mat multiplyBlend(Mat values, Mat colours) {//values 1 channel, colours 3
    //simulates BGR Multiply blend mode 
    ArrayList<Mat> splitColours = new ArrayList<Mat>();
    Core.split(colours, splitColours);
    Core.multiply(values, splitColours.get(0), splitColours.get(0), 1/255.0f);
    Core.multiply(values, splitColours.get(1), splitColours.get(1), 1/255.0f);
    Core.multiply(values, splitColours.get(2), splitColours.get(2), 1/255.0f);
    Mat ret = new Mat();
    Core.merge(splitColours, ret);
    return ret;
}