2016-04-15 7 views
1

赤と緑のチャンネルを変更せずに画像を読み取り、青チャンネルで何らかの処理をしています。OpenCV:保存時にimwriteがチャンネルのピクセル値を変更します

ブルーチャンネルの処理が終了したら、私は3つのチャンネルを1つのRGB画像にマージしました。 imshowを使用してチャンネルを見ると、すべてのことが問題なく、私が行った変更はBlueチャンネルにのみ影響し、赤や緑のチャンネルには影響しないことがわかります。

これまですべてが問題ありません!

しかし、私がimwriteを使って画像を保存すると、結果の画像は若干異なります。青のチャンネルの変更が赤と緑のチャンネルに伝播しているようですが、imwriteは3チャンネル:

image = imread('image.jpg', IMREAD_COLOR); 
split(image, channels); 
// Create some changes on channels[0] 

merge(channels, 3, image); 
// Up to this point every thing is alright 
imwrite("modified.jpg", image); // Image changes when written; 

この現象を回避するための対策はありますか?

答えて

3

JPGは損失フォーマットである:https://en.wikipedia.org/wiki/JPEG

JPEG(/dʒeɪpɛɡ/ JAY-PEG)1は、それらの画像はデジタル写真によって を生じ、特に、デジタル画像のための非可逆 圧縮の一般的に使用される方法です。圧縮の程度は調整することができ、ストレージサイズと画質との間の選択可能なトレードオフを可能にする。 。 JPEGは、通常、イメージ品質でほとんど認識できない損失である、 を10:1の圧縮率で実現します。

解決方法:画像を保存するには、PNGのようなロスレスフォーマットを使用してください。

+0

私が試した最初のことですが、それでも同じことです。 –

+0

私は問題が損失圧縮であるとは思わない。私はMatlabで同じことをやろうとしました。画像を保存すると、1つのチャンネルで何が変わったのか、他のチャンネルは影響を受けないのが分かります。 また、私はこの記事を見つけましたが、関連性があると思います:http://stackoverflow.com/questions/29815299/opencv-2-4-8-2-imshow-differs-from-imwrite?rq=1 今は私が欲しかったことをやってきました。後でそれを調べようとします。正解を投稿するか、それとも誰かがそれを見つけるだろう。 ありがとうございました! –

+0

こんにちは@AllaouaBenchikh、あなたがPNGを使用しようとすると、なぜあなたの質問にそれについて書いていないのですか?質問をするときに試したことを示すと、いつでも役立ちます!あなたは* bmpとして保存しようとする可能性があります。これがうまくいかない場合は、マージされたチャンネルが正しいことを再度確認して、エラーを見つけることができます。あなたは何をしたいのですか?それがあなたの問題に対する解決策(悪いことであっても)であれば、将来の読者を助けるために私たちと共有してください。 – Mailerdaimon

関連する問題