2016-03-19 7 views
2

写真のRチャンネルだけのグレースケール画像が1つあります。そのRチャンネルをRGB画像である新しい画像に書き込もうとしています。理想的には、新しいイメージは古いイメージのように見えますが、赤です。OpenCVで画像を3倍にすると、何が起こりますか?

新しい画像では、古い画像が3回隣り合って表示されます。

グレースケール画像と出力画像が表示されます。ここで

Input image Output image

私のコードですが、私はそれは非常に簡単だと思う:

まず
Mat img_in = imread("in.png", CV_LOAD_IMAGE_GRAYSCALE); 
    Mat img_out = Mat::zeros(img_in.size(), CV_8UC3); 
    for (int i = 0; i < img_in.rows; i++) 
    { 
    for (int j = 0; j < img_in.cols; j++) 
    { 
     img_out.at<Vec3b>(i,j)[2] = img_in.at<Vec3b>(i,j)[2]; 
    } 
    } 
    imwrite("test_img_in.png", img_in); 
    imwrite("test_img_out.png", img_out); 

私はそれがインデックスの重複が整理のいくつかの種類だと思ったが、私は組み合わせの多くを試してみました出力画像を水平方向に3倍、垂直方向には常に3倍します。

私は、OpenCV仕様のなかから、CV_8UC3タイプ(私も他の人も試しました)のように、私が選択したのは、RGBイメージをサポートしていると思っているからです。残念ながら、私はOpenCV自体についてあまり知らないので、私はここで助けを求めています。

PS:これは、3つのグレースケールチャンネル画像からカラー画像を生成したいと考えている全体的なプログラムの一部ですが、現在、整列しているグレースケール画像を合成することになります。投稿したコードは、残りのプログラムから分離されており、このように独自に動作します。
私のOpenCVバージョンは2.4.11です。

+0

を差し引きますが、それは本当に遅くなりますように、このアルゴリズムはなりますので、ちょうど使用しています。なぜ[マージ](http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#void%20merge%28const%20Mat*%20mv,%20size_t%20count,%20OutputArray%20dst%)を使用しないでください。 29)または[mixChannels](http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#void%20mixChannels%28const%20Mat*%20src,%20size_t%20nsrcs,%20Mat*%20dst 、%20size_t%20ndsts、%20const%20int *%20fromTo、%20size_t%20npairs%29)?または、BとGのカラープレーンを変換して空白にします。 –

+0

しかし、これは読み込みに問題があるようです。そのコードの一部を表示できますか? –

+1

try = img_in.at (i、j)代わりに – Micka

答えて

3

問題はここにある:

img_out.at<Vec3b>(i,j)[2] = img_in.at<Vec3b>(i,j)[2]; 

あなたが入力画像がグレーで言ったように。

img_out.at<Vec3b>(i,j)[2] = img_in.at<unsigned char>(i,j); 
+0

ありがとう@DimChtz、これは私の問題を解決しました。私は、グレースケール画像に 'Vec3b'配列がないと仮定します。 –

+0

@CGuy正確には、チャンネルは1つです。 – DimChtz

1

は、あなたが3チャンネルとして、あなたのイメージをロードすることにより、同じ結果を取得し、ちょっとポイント以外Scalar(255,255,0)

#include <opencv2/opencv.hpp> 
using namespace cv; 

int main(int argc, char **argv) 
{ 
    Mat src = imread(argv[1]); 
    imshow("src", src); 
    src -= Scalar(255,255,0); 
    imshow("Red channel", src); 
    waitKey(); 
    return 0; 
} 
関連する問題