我有一个JPG图像,我想找到一种方法:
例如,如果我有一个图像:dog.jpg
我想制作:dog_blue.jpg dog_red.jpg和dog_green.jpg
我不想要每个频道的灰度图像。我希望每个图像都以正确的颜色表示。
我已经设法在gimp中使用分解函数来获取图层,但每一个都是灰度的,我似乎无法为其添加颜色。
我目前正在为其他项目使用OpenCV和Python绑定,因此如果使用gimp不容易,任何合适的代码都可能有用
也许你已经想到了这个,但是这里是为了那些想要以自己的颜色“看到”他们分开的频道的人(即 - 红色,绿色,绿色等)。
每个通道只是单个值图像,可以解释为单色图像。但是你可以通过添加两个假的空通道(下面是zero_channel
)来“添加颜色”,并将cv2.merge
添加到多通道图像中。
#!/usr/bin/env python
import cv2
import numpy as np
import os
import sys
SHOW = True
SAVE = True
def split_channels(filename):
img = cv2.imread(filename)
if len(img.shape) != 3 or img.shape[2] != 3:
sys.stderr.write('{0}: not a correct color image'.format(filename))
return
channels = cv2.split(img)
zero_channel = np.zeros_like(channels[0])
red_img = cv2.merge([zero_channel, zero_channel, channels[2]])
green_img = cv2.merge([zero_channel, channels[1], zero_channel])
blue_img = cv2.merge([channels[0], zero_channel, zero_channel])
if SHOW:
cv2.imshow('Red channel', red_img)
cv2.imshow('Green channel', green_img)
cv2.imshow('Blue channel', blue_img)
cv2.waitKey(0)
if SAVE:
name, extension = os.path.splitext(filename)
cv2.imwrite(name+'_red'+extension, red_img)
cv2.imwrite(name+'_green'+extension, green_img)
cv2.imwrite(name+'_blue'+extension, blue_img)
def main():
if len(sys.argv) < 2:
print('Usage: {0} <rgb_image>...'.format(sys.argv[0]))
map(split_channels, sys.argv[1:])
if __name__ == '__main__':
main()
由于蓝色,绿色,红色图像每个只有1个通道。因此,这基本上是灰度图像。例如,如果你想在dog_blue.jpg中添加颜色,那么你可以创建一个3通道图像并复制所有通道中的内容,或者执行cvCvtColor(src,dst,CV_GRAY2BGR)。现在,您可以添加颜色,因为它已成为3通道图像。
您需要分割图像通道。要做到这一点,你可以使用拆分功能qazxsw poi
source
在BGR图像中,您有三个通道。当您使用split()函数分割通道时,如B,G,R = cv2.split(img),则B,G,R将成为单个或单通道图像。因此,您需要添加两个带零的额外通道,使其成为3通道图像,但为特定颜色通道激活。