如何用蓝色为 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 的评论让我开始思考,这就是结果:
那我做了什么?
我合并了三个频道:
- 蓝色通道中值为 255 的数组
- 原始图像在绿色通道中的灰度
- 红色通道中值为 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))
我有以下图像,我想用蓝色着色。
图像输入:
预期输出:
是否有任何 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 的评论让我开始思考,这就是结果:
那我做了什么?
我合并了三个频道:
- 蓝色通道中值为 255 的数组
- 原始图像在绿色通道中的灰度
- 红色通道中值为 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))