3

BGR 画像を読み込もうとしていますが、いくつかの条件を証明するいくつかのピクセルを、読み込んだ画像の幅、高さ、およびタイプを使用して作成した新しい画像にコピーします。タイプは CV_8UC3 です。

Mat initial_Image = imread("image.jpg");
Mat image(img.rows,img.cols, CV_8UC3);

cout<<initial_Image.type()<<endl;

for(int i = 0;i < img.cols ;i++)
{
for(int j = 0;j < img.rows ;j++)
{
Vec3b intensity = initial_Image.at<Vec3b>(j,i);
uchar blue = intensity.val[0];
uchar green = intensity.val[1];
uchar red = intensity.val[2];


image.at<uchar>(j,i) = blue;
image.at<uchar>(j+1,i+1) = green;
image.at<uchar>(j+2,i+2) = red ;

    }
}
out.close();

imshow("im", image);

条件を配置していませんが、読み取った画像からそれぞれのすべてのピクセルを新しい作成画像にコピーしようとしました。

私の問題は、読み取った画像が 3 チャンネルの RGB であることですが、新しく作成した画像にピクセルをコピーして画像をプロットすると、3 で割った白黒の画像が表示されます。なぜですか? いくつかの条件に基づいてこれが機能するようになったら、ピクセル値を変更する必要があるため、一部の人が示唆するように copyto 関数を使用できません。条件を付けない理由は、修正を行う作業を容易にするためです。ありがとう。

4

1 に答える 1

5

索引付けの方法がimage正しくありません。インデックスを作成している現在の方法はindexにimage書き込み、次の列に到達すると、青色のピクセルが書き込まれ、緑色の値が効果的に上書きされます。代わりに、を使用してインデックスを作成する必要があります。bluej,ij+1,i+1image.at<Vec3b>

最も簡単な方法は、次のようにすることです。

image.at<Vec3b>(j,i) = initial_Image.at<Vec3b>(j,i);

redを変更したい場合はblue、次のgreenようにすることもできます。

Vec3b intensity = initial_Image.at<Vec3b>(j,i);
uchar blue = intensity.val[0];
uchar green = intensity.val[1];
uchar red = intensity.val[2];

//Do stuff with blue, green, and red

image.at<Vec3b>(j,i) = Vec3b(blue,green,red);
于 2013-05-12T14:19:57.483 に答える