2017-04-02 - 2019-01-05 (update) |
|
|
*2値化 とは
多値の画像を2値の画像に変換する処理を2値化と呼びます.画像の2値化の例を図1に示します.
[img:wmbr]
{{small:図1 多値(0~255)の入力画像と2値化した出力画像 閾値は100}}
画像の2値化は,物体検出を簡単にするための前処理に良く利用されます.具体例の1つとして,[link:ARマーカー]の検出があります.
*サンプルコード (C++)
ライブラリ:[link:simplesp]
サンプルコード:simplesp/sample/sp/imgproc
入力画像を2値化します.
*アルゴリズム
基本的には,画像の各画素値を閾値により大小判定することで2値化を行います.
{#
for (int i = 0; i < width * height; i++){
bin[i] = (img[i] >= thresh) ? 255 : 0;
}
#}
**閾値の手動設定
図2は,図1の入力画像のヒストグラムです.
[img:wgvf]
{{small:図2 図1の入力画像のヒストグラム}}
このヒストグラムから,図1の入力画像をうまく2値化するには50~100ぐらいの閾値を設定すればよいことが分かります.このように,入力画像の大体の画素値の分布が分かれば,人が適切な閾値を設定できる場合があります.
しかし,閾値の設定を誤ると,所望の2値化画像が得られない場合があります.図3は閾値140で2値化した結果です.閾値が大きすぎたため,入力画像の左上のやや暗い部分が0として判定されています.
[img:qw7l]
{{small:図3 閾値140で2値化した結果}}
**閾値の自動設定(大津の方法)
入力画像の輝度値の分布に合わせて,閾値を自動設定する大津の方法[1]について説明します.
{{small:[1]Nobuyuki Otsu, "A threshold selection method from gray-level histograms", IEEE Transactions on Systems, Man, and Cybernetics, 1979 [link:https://engineering.purdue.edu/kak/computervision/ECE661.08/OTSU_paper.pdf] }}
大津の方法では,ヒストグラムを分離した時の”分離度”を最大化する閾値を探索します.例えば,ある閾値でヒストグラムを2つのクラスに分離した結果を図4に示します.
[img:3wkq]
{{small:図4 ヒストグラムを2クラスに分離した結果}}
ここでクラスの分離度は,分離した2つのクラスの"クラス内分散"と"クラス間分散"の比によって計算します.クラス内分散{$\sigma_W^2$}はクラス内に属する画素値の平均的な分散を表し,クラス間分散{$\sigma_B^2$}は2つのクラス間の広がりを表します.それぞれ以下の式で定義されます.
{$$
\begin{align*}
\sigma_W^2 &= w_0 \sigma_0^2 + w_1 \sigma_1^2 \\ \\
\sigma_B^2 &= w_0 (\mu_0 - \mu_T)^2 + w_1 (\mu_1 - \mu_T)^2 = w_0 w_1 (\mu_0 - \mu_1)^2 \\ \\
\sigma_T^2 &= \sigma_W^2 + \sigma_B^2
\end{align*}
$$}
ここで,{$w_0$}と{$w_1$}は各クラスに属する画素数の割合です({$w_0 + w_1 = 1$}).{$\sigma_0^2$}と{$\sigma_1^2$}は各クラスに属する画素値の分散です.{$\mu_T$}は画像全体の画素値の平均値を表し,{$\mu_0$}と{$\mu_1$}は各クラスに属する画素値の平均値です({$\mu_T = w_0 \mu_0 + w_1 \mu_1$}).また,画像全体の画素値の分散{$\sigma_T^2$}はクラス内分散とクラス間分散の和で計算できます.
そうすると,分離度{$X$}は次の式で定義できます.
{$$
X = \frac{\sigma_B^2}{\sigma_W^2} = \frac{\sigma_B^2}{\sigma_T^2 - \sigma_B^2}
$$}
ここで,{$\sigma_T^2$}は画像全体の画素値の分散を表す定数です.従って,分離度を最大化するには{$\sigma_B^2$}を最大化すれば良いことが分かります.あとは,想定するすべての閾値(0~255)について{$\sigma_B^2$}を計算し,それが一番大きくなる閾値を探し出します.
大津の方法によって閾値を計算し2値化した例を図4に示します.ちなみにこの例では,閾値は84と計算されました.
[img:bvq9]
{{small:図4 大津の方法によって2値化した結果}}
>> ご意見・ご質問など お気軽にご連絡ください.info