1

JPG 画像があり、次の方法を見つけたいと思います。

  • 画像を赤、緑、青の強度レイヤー (チャンネルあたり 8 ビット) に分解します。
  • これらの「グレースケール」画像のそれぞれを適切な色で色付けします
  • 各チャネルの適切な色で 3 つの出力イメージを生成します。

たとえば、画像がある場合:dog.jpg

作りたいのは:dog_blue.jpg dog_red.jpg と dog_green.jpg

各チャンネルにグレースケール画像は必要ありません。各画像を正しい色で表現したい。

gimp で分解機能を使用してレイヤーを取得することができましたが、それぞれがグレースケールであり、色を追加できないようです。

私は現在、他のプロジェクトにOpenCVとPythonバインディングを使用しているため、gimpで行うのが簡単でない場合は、その側の適切なコードが役立つ場合があります

4

4 に答える 4

1

すでにこれを理解しているかもしれませんが、分離されたチャンネルを独自の色 (つまり、赤に赤、緑に緑など) で「見たい」と考えている人向けです。

各チャンネルは単一値の画像であり、単色画像として解釈される場合があります。zero_channelただし、2 つの偽の空のチャネル (以下)を追加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()
于 2015-05-03T16:04:58.277 に答える
0

青、緑、赤の画像はそれぞれ1 つのチャネルしか持たないため、これは基本的にグレースケールの画像です。たとえば、dog_blue.jpg に色を追加する場合は、3 チャンネルの画像を作成し、すべてのチャンネルの内容をコピーするか、cvCvtColor(src,dst,CV_GRAY2BGR) を実行します。これで 3 チャンネルの画像になったので、色を追加できます。

于 2013-10-07T05:10:53.727 に答える
0

分割画像のチャンネルが必要です。そのためには、分割関数ソースを使用できます

 // "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]);
于 2013-10-07T09:23:49.840 に答える