保存した画像が白飛びしたようになる問題

8bitのbmpファイルを読み込み、ガウシアンフィルタを適応し、原画像から処理後の画像を引き算してその後その画像を保存しました。
しかし、保存した画像がMatlab上で表示されている画像とコントラスとが全く違うものになりました。この問題の原因は何なのでしょうか?写真左が保存した画像で、写真右がMatlab上で表示されてる画像です。
ご教授お願いいたします。
画像の読み込み
img=imread('C:/SNR/slow40s_same.bmp',"bmp");
img2=imread('c:/SNR/slow40s_same2.bmp','bmp');
imshowpair(img,img2,'montage')
ガウシアンフィルタ適応
gusimg=imgaussfilt(img,4.5);
gusimg2=imgaussfilt(img2,4.5);
imshowpair(gusimg,gusimg2,'montage')
imwrite(gusimg,'C:/SNR/gus_slow40s_same.bmp','bmp');
imwrite(gusimg2,'C:/SNR/gus_slow40s_same2.bmp','bmp')
ハイパスフィルタ=イメージからガウス処理(lowpass)したイメージを引く
b=imsubtract(img,gusimg);
b2=imsubtract(img2,gusimg2);
hpassimg=histeq(b);
hpassimg2=histeq(b2);
imshowpair(img,hpassimg,'montage')
title('figure1')
imshowpair(img2,hpassimg2,'montage')
title('figure2')
imwrite(hpassimg,gray,'C:/SNR/hpass_slow40s_same.bmp','bmp');
imwrite(hpassimg2,gray,'C:/SNR/hpass_slow40s_same2.bmp','bmp');

8 Comments

Hernia Baby
Hernia Baby on 1 Aug 2021
もしよろしければ、画像データもいただけますでしょうか?
朋貴 熊田
朋貴 熊田 on 2 Aug 2021
Edited: 朋貴 熊田 on 2 Aug 2021
回答ありがとうございます。
原画像;'slow40s_same.bmp',最終処理後画像:’hpass_slow40s_same.bmp
この方法で送信出来ているのでしょうか?
ちなみに、ガウシアンフィルタ以外のフィルタ処理を試しましたが、’原画像ーフィルタ後処理’の画像を保存すると同じように白くなります。
Atsushi Ueno
Atsushi Ueno on 2 Aug 2021
>保存した画像がMatlab上で表示されている画像とコントラストが全く違うものになりました
保存した画像(再度読みだしたagain)とMatlab上で表示されている画像(hpassimg)のコントラストは同じでした。これは勘違いという事でしょうか?
ヒストグラムも表示してみました。histeqの結果が均等分布になっていませんね。
img=imread('slow40s_same.bmp',"bmp");
gusimg=imgaussfilt(img,4.5);
b=imsubtract(img,gusimg);
imhist(b);
hpassimg=histeq(b);
imhist(hpassimg);
imwrite(hpassimg,gray,'hpass_slow40s_same.bmp','bmp');
again=imread('hpass_slow40s_same.bmp',"bmp");
multi = cat(3,img,gusimg,b,hpassimg,again);
montage(multi);
朋貴 熊田
朋貴 熊田 on 3 Aug 2021
Matlab上で表示されている画像と、保存した画像はどちらが正しい画像なのでしょうか?
Atsushi Ueno
Atsushi Ueno on 3 Aug 2021
私が質問の意図を正確に把握できていないかもしれません。誤解が生じない様に変数名で話しましょう。
  • img:原画像
  • gusimg:ガウシアンフィルタを適応した画像
  • b:ハイパスフィルタ=イメージimgからガウス処理(lowpass)したイメージgusimgを引いた画像
  • hpassimg:bのヒストグラムを均等化してコントラスト強調した画像
  • again:hpassimgを'hpass_slow40s_same.bmp'として保存後、読み込んだ画像
【質問】@朋貴 熊田様の仰る「Matlab上で表示されている画像」とは上記の内どの画像の事ですか?
「保存した画像」は明らかにagainと同じと断定できます。
私の認識では「Matlab上で表示されている画像(hpassimg)」「保存した画像(again)」は同じです。
上記コメントにヒストグラムを表示したように、白飛びしたようになるのはhpassimgから、つまりhisteq(ヒストグラムの均等化によるコントラスト強調)からであって、imwrite(画像の保存)が白飛びしたようになる原因ではないと認識しています。
朋貴 熊田
朋貴 熊田 on 3 Aug 2021
hpassimgをimshowpair()でMatlab上で表示してある画像と、hpassimgをimwrite()で保存した画像の見え方が違うのはおかしくないですか?
Atsushi Ueno
Atsushi Ueno on 3 Aug 2021
自分はhpassimgをMatlab上で表示してある画像と、hpassimgをimwrite()で保存した画像'hpass_slow40s_same.bmp'を(例えばWindowsフォトで)表示して見比べる事をしていないので話が食い違っているのかも知れません。'hpass_slow40s_same.bmp'を再度againに読み込んでMatlab上で表示した画像は同じに見えますがそれでは意味がないのでしょうか?
朋貴 熊田
朋貴 熊田 on 3 Aug 2021
それだと値を変化させて私自身が欲しいと思う画像を保存できないので、そこは一致してもらわないと困ります。

Sign in to comment.

 Accepted Answer

Atsushi Ueno
Atsushi Ueno on 4 Aug 2021

1 vote

@和神 水ノ江さんが間接的に教えて下さいました。(imshow関数の機能に気付かされ、本質問の原因が判りました)
>この問題(画像が白飛びしたようになる問題)の原因は何なのでしょうか?
⇒ヒストグラム均等化(histeq)が期待通りに動作していない事です。
⇒そして、imshowpair関数がこの本来の原因を隠してしまいました。(後述します)
img=imread('slow40s_same.bmp',"bmp");
gusimg=imgaussfilt(img,4.5);
b=imsubtract(img,gusimg);
hpassimg=histeq(b);
imhist(hpassimg); % 問題画像のヒストグラムを表示⇒0-255に均等化されていない
imshow(hpassimg); % これが本来の画像の見え方(imwriteで保存した画像の見え方と同じ)
imshow(hpassimg,[]); % これが「ピクセル値の範囲に基づいてスケーリングして表示」した結果
つまりこういう事です。imshow関数は上記の「スケーリングして表示する機能」を引数の追加imshow(hpassimg,[])により有効にしますが、imshowpair関数はこのスケーリング機能がデフォルトで適用されます。これが原因です。

1 Comment

朋貴 熊田
朋貴 熊田 on 4 Aug 2021
回答ありがとうございます。
ヒストグラムの均等化が、0~255までデフォルトで出来ない使用になっている。そのため、その値を引き延ばさず0~255表示してしまうImshowpair()デフォルトの機能によって、表示されている画像と保存した画像に違いが出てしまっているという事なんですね。
解決方としては、ヒストグラムの均等化を正しく行う様にするか、一旦保存した画像を読み込みそれをimshowpair()で表示すればよさそうですね。
ここまで、親身に私自身の問題について付き合って頂きありがとうございます。

Sign in to comment.

More Answers (0)

Categories

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!