答案 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)
val = 0.75
fin = cv2.addWeighted(blue, val, im, 1 - val, 0)
cv2.imshow('Transparent_image', fin)
如@vasia所述,将红色和绿色像素设置为0
不会产生所需的效果。这就是我得到的结果:
<强>更新强>
@ MarkSetchell的评论让我思考,这就是结果:
那我该怎么办?
我合并了三个频道:
谢谢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()
以下是一个例子:
答案 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))