パート2 で書いたコードでいろいろなパンの写真を切り抜いて見ます。
なお、このエントリーはオライリー本の「実践コンピュータビジョン」を参考にしているので詳細はそちらをご覧ください。
題材として使用した画像なので当然ですが、意図通り領域分割できています。
これも意図通り処理できているようです。
これも意図通り処理できているようです。
パンの左半分がうまく識別できていません。
あんこの部分が背景として識別されてしまったようです。 そう簡単にはいかないですね。
今回のコードでは ソースピクセルの色は黒、シンクピクセルの色は白に決め打ちしている。 その上で、重み計算では、以下のように R,G,Bそれぞれの差を計算して自乗して足したものをルートした値を使っているため パンと背景を分離するために、より黒に近いか、より白に近いかという特徴量の計算をしていることになる。
MAX_VALUE = math.sqrt( math.pow( 255, 2) + math.pow( 255, 2) + math.pow( 255, 2) )
def create_weight( px_rgb_0, px_rgb_1 ):
value = math.sqrt(
math.pow( px_rgb_0[0] - px_rgb_1[0], 2) +
math.pow( px_rgb_0[1] - px_rgb_1[1], 2) +
math.pow( px_rgb_0[2] - px_rgb_1[2], 2) )
return MAX_VALUE - value
だから、クリームパンのようにパンが白というより茶色に近い場合、黒に近いか茶色に近いかで特徴量としての重み計算をすれば、うまくパンと背景を分けることができたかもしれない。
ただ、このようなパンと背景の特徴計算を対象画像内容ごとに人で判断して個々に決めるのは、全くうれしくない。 特徴量を自動で計算できるようなよい方法はないのか?