Grad-CAMイメ​ージとオリジナルイメ​ージを同じ大きさで並​べて表示する方法

8 次查看(过去 30 天)
YutaKawaguchi
YutaKawaguchi2022-8-18
评论: YutaKawaguchi ,2022-8-19
Grad-CAMイメージと、オリジナルイメージを並べて表示するコードを作成したのですが、
Grad-CAM側のイメージが小さく表示されてしまいます。
イメージをjpgで保存した際の背景も含めてサイズ調整してしまっていることが原因のようです。
問題点としては、
①いったん保存しないと、エラーでサイズ変更、並列表示ができない。
②実際のイメージ部分のみ保存する。
このいずれかで、解決できると考えています。
Originimg = imshow(img);
解析画像ごとのファイル名を指定。指定は元ファイル名+gradcam
file = ClassFile{FileNum,1};
[filepath,fileName,imageFT] = fileparts(file);
GradCAMFileName=fileName+"【Grad-CAM】"+imageFT;
元画像に重ねて解析結果を表示
hold on;
Gradimg = imagesc(gradcamMap,'AlphaData',0.5);
colormap jet
hold off;
saveas(Gradimg,GradCAMFileName);
1度保存して、読み込む必要あり
outputSize = [160 704]
Gradimg = imread(GradCAMFileName)
imshow(Gradimg)
Gradimg = imresize(Gradimg,outputSize)
Gradimg = imshow(Gradimg)
saveas(Gradimg, GradCAMFileName)
Comparisonimg = imtile({GradCAMFileName;GradDs})
Comparisonimg = imshow(Comparisonimg)
解析画像を保存する。
title(sprintf("%s(%2f)",classfn,score(classfn)));
saveas(Comparisonimg,GradCAMFileName);
現在のGradCAM表示周辺のコードは以上です。
いい解決策があれば、教えてください。
また、現在横長のイメージを使用しているので、縦に並べて表示する方法があれば、
合わせて教えていただけると幸いです。
よろしくお願いいたします。

采纳的回答

Atsushi Ueno
Atsushi Ueno 2022-8-18
>いい解決策があれば、教えてください。
figure を経由せず画像データを直接処理すれば、問題点①・②とも回避する事ができます。
>現在横長のイメージを使用しているので、縦に並べて表示する方法があれば、合わせて教えていただけると幸いです。
imtile関数のオプション 'GridSize' を変更して画像を縦に並べる事が出来ます。
% Originimg = imshow(img);
% 解析画像ごとのファイル名を指定。指定は元ファイル名+gradcam
file = ClassFile{FileNum,1};
[filepath,fileName,imageFT] = fileparts(file);
GradCAMFileName=fileName+"【Grad-CAM】"+imageFT;
% 元画像に重ねて解析結果を表示
gradcamMapRGB = uint8(ind2rgb(uint8(rescale(gradcamMap,1,256)),colormap(jet))*255); % 解析結果のデータ型を変更
Gradimg = uint8(gradcamMapRGB * 0.5 + img * (1 - 0.5)); % 元画像と解析結果を重ね合わせる
% 比較画像を作成・表示する
Comparisonimg = imtile({Gradimg;GradDs},'GridSize',[2 1]); % 縦に並べる
Comparisonimg = imshow(Comparisonimg)
% 解析画像を保存する。
title(sprintf("%s(%2f)",classfn,score(classfn)));
saveas(Comparisonimg,GradCAMFileName);
下記条件が成立していれば上手くいくと思います。
  • 元画像imgと解析結果gradcamMapのサイズが同一
  • 元画像imgはRGBイメージデータ(uint8)
  • 解析結果gradcamMapはdouble型データ(値域は任意)
【良く解る解説】
figure を経由せず画像データを直接処理すれば良いのですが、その際に元画像 img と解析結果 gradcamMap のデータ型を合わせて演算する必要があります。(解析結果 gradcamMapを1-256にリスケール ⇒インデックス付きイメージ (カラーマップ 'jet') ⇒ RGB イメージに変換しています。結構めんどい)
Grad-CAM での深層学習による判定の理由の解明 - MATLAB & Simulink - MathWorks 日本の例を参考にして、imagesc関数の「透明度のデータ」を使わずに元画像と解析結果を重ね合わせた画像を作成してみました。
net = googlenet;
img = imresize(imread("sherlock.jpg"),net.Layers(1).InputSize(1:2)); % リサイズ済の元画像
[classfn,score] = classify(net,img);
map = gradCAM(net,img,classfn);
mapRGB = uint8(ind2rgb(uint8(rescale(map,1,256)),colormap(jet))*255); % 解析結果のデータ型を変更
Gradimg = uint8(mapRGB * 0.5 + img * (1 - 0.5)); % 元画像と解析結果を重ね合わせる
imshow(Gradimg);
  3 个评论
YutaKawaguchi
YutaKawaguchi 2022-8-19
サイズ変更についても巧く行きました。
outputSize = [320 704]%元画像のサイズを設定
Comparisonimg = imresize(Comparisonimg,outputSize)%サイズ変更
Comparisonimg =imshow(Comparisonimg)
ありがとうございました。

请先登录,再进行评论。

更多回答(0 个)

产品


版本

R2021b

Community Treasure Hunt

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

Start Hunting!