2013-10-06 114 views
1

我有一个JPG图像,并且我想找到一种方法:如何使用Gimp/OpenCV Color将图像分成彩色RGB层?

  • 将图像分解成红,绿和蓝色的亮度的层(每通道8比特)。
  • 使用适当的颜色对这些现在的“灰度”图像进行着色
  • 以适当的颜色为每个通道生成3个输出图像。

例如,如果我有一个形象: dog.jpg

我想生产: dog_blue.jpg dog_red.jpg和dog_green.jpg

我不想为每个灰度图像渠道。我希望每个图像都用正确的颜色表示。

我已经设法使用gimp中的分解函数来获取图层,但每个图层都是灰度图,我似乎无法为其添加颜色。

我目前使用的OpenCV和Python绑定其他项目,所以任何合适的代码,如果它是不容易与瘸子做边可能是有用的

回答

0

随着蓝色,绿色,红色图像各有1频道只。所以,这基本上是一个灰度图像。 如果您想在dog_blue.jpg中添加颜色,例如您将创建一个3通道图像并复制所有通道中的内容,或者复制cvCvtColor(src,dst,CV_GRAY2BGR)。现在,您将可以为其添加颜色,因为它已经成为3通道图像。

+0

如何colourise每个新的3个通道图像 – Steve

+0

的。如果你想例如dog_blue.jpg为1通道3通道然后使用** cvCreateImage只需创建一个3通道图像**,然后做cvCvtColor(src,dst,CV_GRAY2BGR)。我相信你在问这个。 – Aizen

0

您需要分割图像的频道。要做到这一点,您可以使用拆分功能source

// "channels" is a vector of 3 Mat arrays: 
vector<Mat> channels(3); 
// split img: 
split(img, channels); 
// get the channels (dont forget they follow BGR order in OpenCV) 

namedWindow("channelR",1); 
namedWindow("channelB",1); 
namedWindow("channelG",1); 

imshow("channelB",channels[0]); 
imshow("channelG",channels[1]); 
imshow("channelR",channels[2]); 

imwrite("channelR.jpg", channels[2]); 
imwrite("channelG.jpg", channels[1]); 
imwrite("channelB.jpg", channels[0]); 
1

也许你已经想通了这一个了,但在这里是谁想要“看到”自己的颜色的分离通道(即人 - 红的红,绿绿色等)。

每个通道只是一个单值图像,可能被解释为单色图像。但是,您可以通过将两个虚假的空通道(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() 
相关问题