如何用蓝色为 RGB 图像着色?

How can l colorize an RGB image with blue color?

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

图像输入:

预期输出:

是否有任何 skimage 或 opencv 工具可以进行这种操作?

谢谢

您可以通过将两个图像混合在一起来实现此目的,创建一个只是您的蓝色图像,然后将其与您选择的 alpha 混合在一起:

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

您可以在此 blog post

上更详细地了解这如何影响您的图像

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

您可以通过应用透明叠加来获得所需的效果。我通过 trial-and-error 大致弄清楚了颜色(天蓝色)。它可以更改为任何可能的颜色。

在 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)

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

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

更新

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

那我做了什么?

我合并了三个频道:

  1. 蓝色通道中值为 255 的数组
  2. 原始图像在绿色通道中的灰度
  3. 红色通道中值为 0 的数组

谢谢马克!!

要准确回答您的问题,您只需将其他通道设置为 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()

这是一个例子:

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))