如何用蓝色着色RGB图像?

时间:2018-05-23 15:02:57

标签: python opencv pillow scikit-image

我有以下图像,我想用蓝色着色。

图像输入:
inputs

预期产量:
Expected_output

是否有允许进行此类操作的skimage或opencv工具?

谢谢

5 个答案:

答案 0 :(得分:4)

您可以通过应用透明覆盖来获得所需的效果。我通过反复试验粗略地弄清了颜色(天蓝色)。它可以改为任何颜色。

在OpenCV中,您可以将cv2..addWeighted()用于此目的

代码:

import numpy as np
import cv2

image = 'C:/Users/Desktop/city.jpg'
im = cv2.imread(path, 1)

blue = np.zeros_like(im)
blue[:] = (255, 200, 0)     #<--- Change here
cv2.imshow('blue.jpg', blue)

enter image description here

val = 0.75
fin = cv2.addWeighted(blue, val, im, 1 - val, 0)
cv2.imshow('Transparent_image', fin)

enter image description here

如@vasia所述,将红色和绿色像素设置为0不会产生所需的效果。这就是我得到的结果:

enter image description here

<强>更新

@ MarkSetchell的评论让我思考,这就是结果:

enter image description here

那我该怎么办?

我合并了三个频道:

  1. 蓝色通道中的值数组255
  2. 绿色通道中原始图像的灰度
  3. 红色通道中值0的数组
  4. 谢谢Mark !!

答案 1 :(得分:1)

要准确回答你的问题,你可以将其他频道设置为0.你可能想要将它们设置得比它高一些,或者事情最终有点暗,但是你走了:

img = cv2.imread(your_image)
img[:, :, 1] = 0  # (or 20)
img[:, :, 2] = 0

cv2.namedWindow("test")

while True:
    cv2.imshow("test", a)
    ch = cv2.waitKey & 0xFF
    if ch == ord('q'):
    break

cv2.destroyAllWindows()

以下是一个例子:

Original Image Blue Cage

答案 2 :(得分:0)

你可以通过将两个图像混合在一起,创建一个只是你的蓝色图像,然后将它与你选择的alpha混合在一起来做到这一点:

here是关于如何做到这一点的OpenCV教程。

您可以在blog post

上更详细地了解这会如​​何影响您的图片

答案 3 :(得分:0)

典型的位图图像是像素的二维网格,其中每个像素是一组三个整数,范围从0到255,表示红色,绿色和蓝色。如果只想查看图像的蓝色通道,可以从原始图像中的像素创建新图像,并将每个像素的红色和绿色像素值设置为0,只留下蓝色。

答案 4 :(得分:0)

numpy解决方案

import numpy as np
import skimage.io

def blend(a, b, alpha):
    return (alpha * a + (1 - alpha) * b).astype(np.uint8)

def luma(img):
    rgb_to_luma = np.array([0.2126, 0.7152, 0.0722]) # BT.709
    return np.repeat((img * rgb_to_luma).sum(axis=-1).astype(np.uint8), 3).reshape(img.shape)

BGCOLOR = np.array([1, 174, 242])

img = skimage.io.imread('city.jpg')
bg = np.ones_like(img) * BGCOLOR

skimage.io.imsave('blue.png', blend(luma(img), bg, 0.2))

enter image description here