1

私はcvSplit()を使用してRGBチャネルを分離し、色r、g、bを示す3つの異なる画像に印刷しています。しかし、私は白黒写真のBW画像しか得られませんでした。これはcvSplit()を使用するときの正しい出力ですか?または私はそれを着色するために何かをしなければなりませんか?以下はこれまでの私のコードです。

![#include <iostream>
#include <cv.h>
#include <highgui.h>
#include "rgb.h"

using namespace std;

int main(){
IplImage* img = cvLoadImage("rgb.jpg");



IplImage* channelRed = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* channelGreen = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* channelBlue = cvCreateImage(cvGetSize(img), 8, 1);



IplImage* Result1 = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* Result2 = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* Result3= cvCreateImage(cvGetSize(img), 8, 1);



cvSplit(img, channelBlue, channelGreen, channelRed, NULL);



cvThreshold(channelBlue, Result1, 20, 255, CV_THRESH_BINARY);
cvThreshold(channelGreen, Result2, 20, 255, CV_THRESH_BINARY);
cvThreshold(channelRed, Result3, 20, 255, CV_THRESH_BINARY);





cvShowImage("original", img);

cvShowImage("blue", Result1);
cvShowImage("green", Result2);
cvShowImage("red", Result3);

cvWaitKey(0); 


return 0;
}][1]
4

2 に答える 2

1

このようには機能しません。シングルチャンネル画像がある場合、opencvはそれがグレースケールであると想定します。

できることは、同じサイズの青、赤、緑のフィルター画像を作成し、対象のチャネルに255を、他のチャネルにすべてゼロを入力することです。

次に、次の関数を実行して青い画像を取得します。

cvAnd(original_img,bluefilter_img,blue_result_img)

赤と緑のフィルターについて繰り返します。

于 2013-03-06T00:27:12.650 に答える
0

3 チャンネルの画像がある場合、cvSplitそれを使用すると、シングル チャンネルの画像であるため、3 つのグレー スケール画像 (B&W ではない) が得られます。

img(R,G,B) ==> chRed(R)、chGreen(G)、chBlue(B)、R、G、B は 0 から 255 まで。

img は 255*255*255 色で、その他は 256 色しかありません。

そして、後でそれらをしきい値処理するため、白黒画像になります。OpenCV 2.4.4 の最新バージョンを使用して、より自動化された堅牢な処理を行うことができますthreshold(imgIn, imgOut, 100, 255, CV_THRESH_OTSU); (参照: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html?highlight=threshold#cv.しきい値)

したがって、目標が芸術的な視点を持つことである場合、ペルファノフが言ったことは正しい方法です。ただし、色検出を使用して何らかの作業を行うことを計画している場合、単一チャネルの画像に色を使用するビジネスはありません (不可能であるため)。

それが明確だったかどうかはわかりません、教えてください。

于 2013-03-06T14:01:48.317 に答える