目次へのリンク
概要
MATLABによる二値化、適応二値化について紹介します。とてもシンプルです。
Image Processing Toolboxが必要ですね。はい。
対応ファイル:[I2_03_1_adaptThresholding.m]
(https://github.com/mathworks/MATLAB-IPCV-Eval-Kit-JP/blob/master/demo_files/I2_03_1_adaptThresholding.m)
初期化
clc;clear;close all;imtool close all;
画像の読込み・表示
G = imread('coins.png');
% 可視化
figure; imshow(G);
Otsu法により、大局的しきい値により画像を二値化
BW = imbinarize(G);
% 可視化
figure; imshow(BW);
穴を埋める
コインの内部が二値化しきれていないので、別途モルフォロジー処理で埋めてしまいます。
BWf = imfill(BW, 'holes');
% 可視化
figure; imshow(BWf);
適応二値化
次に適応二値化についてみていきます。先ほどの方法は、画像全体に同じしきい値を適用して、二値化していきました。それに対してこちらは、画像の場所によってしきい値を適応的に変えて二値化するものです。背景の明るさにばらつきがある場合に効果を発揮します。
G = imread('printedtext.png');
% 可視化
figure; imshow(G);
ご覧の通り明るさにかなり違いがあります。
輝度の局所平均を用い、画素単位で適応しきい値計算
T = adaptthresh(G, 0.4, 'ForegroundPolarity','dark'); % 黒い部分が前景
figure; imshow(T); % しきい値の可視化
%% 算出したしきい値で、画像を二値化・表示
BW = imbinarize(G, T);
imshow([G; BW*256]); truesize; shg; % 原画像を結果を、縦に並べて表示
画像の場所によらずきちんと二値化できていますね。他の例も見てみます。
% 別の画像の読込み・表示
G = imread('rice.png');
figure; imshow(G);
% 画像を適応二値化・表示
BW = imbinarize(G, 'adaptive', 'sensitivity',0.4);
figure; imshowpair(G, BW, 'montage');
こちらもきちんとできていますね。場所によってしきい値を変えるので、結果画像がパッチ上に不連続になってしまう場合もあります。適宜使い分けることが重要かと思います。
謝辞
本記事は @eigs さんのlivescript2markdownを使わせていただいてます。