画像情報処理特論⑦

1.6K Views

December 09, 23

スライド概要

第7回 画像の定量評価(RMSE、PSNR、SD)

profile-image

大学教員です。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

2018/05/31 画像情報処理特論 第7回 画像の定量評価(RMSE、PSNR、SD) 東京工科大学 助教 加納 徹

2.

授業計画 第1回:ガイダンス、Java開発環境の構築 第2回:GUIアプリケーション開発、画像データの入出力 第3回:前処理(1)(二値化処理、画像の配列化) 第4回:前処理(2)(モルフォロジー演算) 第5回:前処理(3)(平滑化、鮮鋭化) 第6回:後処理(描画操作、領域塗りつぶし) 第7回:画像の定量評価(RMSE、PSNR、SD) 第8回:コンピュータ診断支援への展開、まとめ 2

3.

注意事項 ⚫ 前回作った GUI を一部削除します ⚫ プロジェクトを右クリックし、 [コピー] で複製しておくことを おすすめします 3

4.

画像の定量評価

5.

画像の定量評価指標 ⚫ 比較(正解)画像がある場合 ➢ MSE (Mean square error: 平均二乗誤差) ➢ RMSE (Root mean square error: 平均二乗誤差平方根) ➢ PSNR (Peak signal-to-noise ratio: ピーク信号対ノイズ比) ➢ SSIM (Structural similarity: 構造的類似性) ⚫ 比較(正解)画像がない場合 ➢ SD (Standard deviation: 標準偏差) ➢ CNR (Contrast-to-noise ratio: コントラスト対ノイズ比) ➢ NPS (Noise power spectrum: ノイズパワースペクトラム) ➢ MTF (Modulation transfer function: 変調伝達関数) 5 うわぁ

6.

画像の定量評価指標 ⚫ 比較(正解)画像がある場合 ➢ MSE (Mean square error: 平均二乗誤差) ➢ RMSE (Root mean square error: 平均二乗誤差平方根) ➢ PSNR (Peak signal-to-noise ratio: ピーク信号対ノイズ比) ➢ SSIM (Structural similarity: 構造的類似性) ⚫ 比較(正解)画像がない場合 ➢ SD (Standard deviation: 標準偏差) ➢ CNR (Contrast-to-noise ratio: コントラスト対ノイズ比) ➢ NPS (Noise power spectrum: ノイズパワースペクトラム) ➢ MTF (Modulation transfer function: 変調伝達関数) 6 とりあえずこの3つを実装できるようになろう

7.

MSE (Mean square error) ⚫ 画素値の差分を二乗して足していき、 平均値をとったもの 𝐻−1 𝑊−1 1 MSE = ෍ ෍ 𝐼0 𝑥, 𝑦 − 𝐼 𝑥, 𝑦 𝑊×𝐻 𝑦=0 𝑥=0 𝐼0 : 𝐼 : 𝑊: 𝐻: 7 オリジナルの画像 評価対象の画像 画像の幅 画像の高さ 2枚の画像が全く同じとき、MSE は 0 になるね 2

8.

RMSE (Root mean square error) ⚫ 画素値の差分を二乗して足していき、 平均値の平方根をとったもの 𝐻−1 𝑊−1 RMSE = 1 ෍ ෍ 𝐼0 𝑥, 𝑦 − 𝐼 𝑥, 𝑦 𝑊 ×𝐻 𝑦=0 𝑥=0 𝐼0 : 𝐼 : 𝑊: 𝐻: 8 オリジナルの画像 評価対象の画像 画像の幅 画像の高さ 平方根の計算は Math.sqrt() でいいか 2

9.

PSNR (Peak-to-noise ratio) ⚫ 信号が取りうる最大画素値とノイズの比率 MAX2𝐼 PSNR = 10 ⋅ log MSE MAX𝐼 = 20 ⋅ log RMSE MSE : 平均二乗誤差 RMSE : 平均二乗誤差平方根 MAX𝐼 : I の最大画素値 9 一般的なグレースケール画像の場合、最大画素値は 255

10.

SD (Standard deviation) ⚫ 画素値の分散(ばらつき)の平方根 𝑤 SD = 1 ෍ ෍ 𝐼 𝑥, 𝑦 − 𝐼 𝑥, 𝑦 𝑤 ×ℎ 𝑦 𝐼 𝑥, 𝑦 = 𝐼 𝐼ҧ 𝑤 ℎ 10 ℎ : : : : 𝑥 𝑤 ℎ 𝑦 𝑥 1 ෍ ෍ 𝐼 𝑥, 𝑦 𝑤×ℎ 評価対象の画像 画像の平均画素値 ROI(関心領域)の幅 ROI(関心領域)の高さ 2

11.

補足説明① ファイル選択ダイアログ

12.

ファイル選択ダイアログ(読み込み時) private void btnReadActionPerformed(java.awt.event.ActionEvent evt) { // ファイル選択ダイアログの生成 JFileChooser fc = new JFileChooser(System.getProperty("user.dir")); if (fc.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) return; try { // 画像ファイルの読み込み bufImage = ImageIO.read(fc.getSelectedFile()); // 画像ファイルをラベルに貼り付け lblDraw.setIcon(new ImageIcon(bufImage)); } catch (IOException e) { e.printStackTrace(); } } 「System.getProperty(“user.dir”)」は実行中ファイルのフォルダパス 12 ここを変更すれば、ダイアログの初期フォルダを変更できる

13.
[beta]
ファイル選択ダイアログ(書き出し時)

private void btnWriteActionPerformed(java.awt.event.ActionEvent evt) {

// ファイル選択ダイアログの生成
JFileChooser fc = new JFileChooser(System.getProperty("user.dir"));
if (fc.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) return;
try {
// 画像ファイルの書き出し

ImageIO.write(bufImg, "bmp", fc.getSelectedFile());
JOptionPane.showMessageDialog(this, "保存しました");
} catch (IOException e) {
e.printStackTrace();
}

}

14.

おまけ:ファイル読み込みの拡張 String lastDir = “”; private void btnReadActionPerformed(java.awt.event.ActionEvent evt) { // ファイル選択ダイアログの生成 JFileChooser fc; if (!lastDir.equals("")) fc = new JFileChooser(lastDir); else fc = new JFileChooser(System.getProperty("user.dir")); if (fc.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) return; try { // 画像ファイルの読み込み if (!lastDir.endsWith(".bmp")) lastDir += ".bmp"; // 画像ファイルをラベルに貼り付け lblDraw.setIcon(new ImageIcon(bufImage)); // 最後に利用したファイルパスを記憶 lastDir = fc.getSelectedFile().getAbsolutePath(); } catch (IOException e) { e.printStackTrace(); } 14 }

15.
[beta]
おまけ:ファイル書き出しの拡張
private void btnWriteActionPerformed(java.awt.event.ActionEvent evt) {

// ファイル選択ダイアログの生成
JFileChooser fc;
if (!lastDir.equals()) fc = new JFileChooser(lastDir);
else fc = new JFileChooser(System.getProperty("user.dir"));
if (fc.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) return;

try {
// 画像ファイルの書き出し
lastDir = fc.getSelectedFile().getAbsolutePath();
if (!lastDir.endsWith(".bmp")) lastDir += ".bmp";
ImageIO.write(bufImg, "bmp", fc.getSelectedFile());

JOptionPane.showMessageDialog(this, "保存しました");
} catch (IOException e) {
e.printStackTrace();
}
}

15

16.

さらにおまけ - 1 (ドラッグ & ドロップによる読み込み) 次のように書いてみましょう public class FrameMain extends javax.swing.JFrame implements DropTargetListener { public FrameMain() { initComponents(); // ドラッグ & ドロップ領域の設定 new DropTarget(lblDraw, this); } エラーが表示されるので [Alt]+[Enter]キーを押して 「すべての抽象メソッドを実装」を選択

17.
[beta]
さらにおまけ - 2

(ドラッグ & ドロップによる読み込み)
@Override
public void dragEnter(DropTargetDragEvent dtde) {}
@Override
public void dragOver(DropTargetDragEvent dtde) {}
@Override
public void dropActionChanged(DropTargetDragEvent dtde) {}

@Override
public void dragExit(DropTargetEvent dte) {}
@Override
public void drop(DropTargetDropEvent dtde) {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
Transferable trans = dtde.getTransferable();
try {
if (trans.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
File dragFile = ((List<File>) trans.getTransferData(DataFlavor.javaFileListFlavor)).get(0);
bufImg = ImageIO.read(dragFile);
lblDraw.setIcon(new ImageIcon(bufImg));
}
} catch (Exception e) {
e.printStackTrace();
}
}

17

18.

補足説明② タブの使い方 GUI名:JTabbedPane 切り替え可能なタブを生成するためのコンポーネント

19.

タブの使い方 - 1 Swing コンテナから「タブ付きペイン」を ドラッグして貼り付けます

20.

タブの使い方 - 2 Swing コンテナから「スクロールペイン」を ドラッグして貼り付けます 20

21.

タブの使い方 - 3 タブが生成されます (タブの名前変更: [右クリック] ➡ [テキストを編集]) 21

22.

タブの使い方 - 4 スクロールペインの上にラベルを貼り付けます (ラベルをタブに直接貼り付けることも可) 22

23.

タブの使い方 - 5 同じ要領で複数のタブを作ることができます 23 表示タブの変更は GUI部品名.setSelectedIndex() で行う!

24.

演習問題 【演習1】 新しいプロジェクト ImageEvaluation を作成し、タブ付きペインを 利用して2つの画像ファイルを読み込むことができるようにしなさい。 【演習2】 読み込んだ画像に対して RMSE、PSNR の値を算出しなさい。 (jTextArea を用いて結果ログを表示させる方法が望ましい。) 【演習3】 読み込んだ画像に対して SD の値を算出しなさい。 (マウスドラッグにより ROI をユーザが指定できることが望ましい。) 読み込んだ画像の画素値を、配列に格納しましょう 24

25.

宿題 提出課題なし (次回、時間内提出課題を予定) ※今日の内容の実装を済ませておくこと ※これまでの内容を復習しておくこと 25 やった!!

26.

お疲れ様でした つづく