1

3 つのチャネルを持つマトリックスがあり、要素の値にアクセスして変更するのに問題があります。私はこのコードを持っています:

Mat m(4,4, CV_8UC3);   
Vec3b a;
a[0] = 255;
a[1] = 0;
a[2] = 0;
m.at<Vec3b>(0,0) = a;

行列 m を印刷すると、次のようになります。

[255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

これは良いことですが、マトリックスを保存すると得られる画像imwriteは次のとおりです。

ここに画像の説明を入力

なぜそれが青なのか、なぜ正方形の 2x2 青があるのか​​ わかりません。最初のピクセルの赤だけを持っているべきではありませんか?

私はどこかで間違いをしましたか?

4

2 に答える 2

3

なぜ青なのかわからない…赤じゃない?

OpenCV では、イメージを作成するときにイメージ フォーマットがフラグによって設定されます。たとえばCV_8UC3、8 ビット ピクセル、符号なし、3 つのカラー チャネルを意味します。カラー イメージでは、ピクセルの順序はでありBGR、データは行の順序で格納されます。同様にBGRACV_8UC4. したがって、設定した値は赤ではなく青です。これが青になった理由です。

私は最初のピクセルだけを持っていたはずです...?

その理由は、圧縮されたイメージ タイプJPGの場合、コンテンツを正確に保持することを保証できないためです。imwrite()圧縮されていない画像などに試してみてくださいBMP(通常)。次のような画像が得られます。

ここに画像の説明を入力

于 2014-01-13T19:15:12.780 に答える
0

前述のように、JPEG は非可逆アルゴリズムであるため、高輝度ピクセルの隣のピクセルは JPG 圧縮後にゼロ以外の値を取ります。実際、JPEG 圧縮では、勾配の強い画像領域の情報が正確に破棄されます。

2 番目の質問については、Opencv の癖が原因でピクセルが青色になっています。カラー チャネルは R、G、B の順序ではなく、B、G、R の順序で保存されます。

カラー画像の場合、チャネルの順序は通常、青、緑、赤です

ソース: http://docs.opencv.org/modules/core/doc/drawing_functions.html?highlight=green

(これは、Opencv プログラマーの人生を悲惨なものにするものの 1 つです)

于 2014-01-13T22:42:00.253 に答える