目次へのリンク
概要
MATLABによるヒストグラムマッチングについて紹介します。いつもどおりとてもシンプルです。
Image Processing Toolboxが必要です。
対応ファイル:[I2_03_3_histmatch.m]
(https://github.com/mathworks/MATLAB-IPCV-Eval-Kit-JP/blob/master/demo_files/I2_03_3_histmatch.m)
初期化
clear;clc;close all;imtool close all
画像の読込み・表示
まず、画像を読み込みます。
Ref = imread('I2_03_3_knee1a.tif'); % 膝のMRIイメージの読込み
A = imread('I2_03_3_knee1b.tif');
figure;imshow([Ref A]);
ご覧の通り、明るさが画像間で異なっていることがわかります。
ヒストグラム表示
ヒストグラムでそれぞれの輝度分布を見てみましょう
figure;
subplot(2,2,1);imhist(Ref);title('リファレンス');
subplot(2,2,2);imhist( A);
目視でわかる通り、リファレンス画像に対して、knee1bの方は輝度が小さいことがわかります。
ヒストグラムのマッチング
リファレンスにマッチするように、knee1bの輝度分布を補正してあげます。
B = imhistmatch(A, Ref, 256); % AのヒストグラムをRefに一致させる
subplot(2,2,4);imhist(B);title('処理結果'); shg;
きちんと補正されている様子がわかりますね。
結果の表示
figure;imshow([Ref repmat(239,[512 20]) B]);
結果として見た目がほぼ同じになりました!
imhistに関しては、経験から1 点注意が必要です。それは入力する画像データの型ですね。
uint8型だと0-255の範囲でヒストグラムをプロットしてくれます。
singleかdoubleだと0-1の範囲でヒストグラムをプロットしてくれます。注意が必要なのはこの浮動小数点型の時ですね。データの絵dswpqぉmk、範囲が0-1に納まっていないと当然出てくるプロットは役に立たないものになりますので、ご注意いただければと思います。データの正規化にはrescale関数が使えますヨ。
謝辞
本記事は @eigs さんのlivescript2markdownを使わせていただいてます。