Thursday, July 20, 2017 / DTP, Python

グラフカットを使った画像の切り抜き(パート3)

パート2 で書いたコードでいろいろなパンの写真を切り抜いて見ます。

なお、このエントリーはオライリー本の「実践コンピュータビジョン」を参考にしているので詳細はそちらをご覧ください。

白パン

graph-cut

題材として使用した画像なので当然ですが、意図通り領域分割できています。

食パン

graph-cut

これも意図通り処理できているようです。

フランスパン

graph-cut

これも意図通り処理できているようです。

クリームパン

graph-cut

パンの左半分がうまく識別できていません。

カットしたアンパン

graph-cut

あんこの部分が背景として識別されてしまったようです。 そう簡単にはいかないですね。

ソースピクセル, シンクピクセル, 重み計算を工夫すれば…

今回のコードでは ソースピクセルの色は黒、シンクピクセルの色は白に決め打ちしている。 その上で、重み計算では、以下のように 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

だから、クリームパンのようにパンが白というより茶色に近い場合、黒に近いか茶色に近いかで特徴量としての重み計算をすれば、うまくパンと背景を分けることができたかもしれない。

ただ、このようなパンと背景の特徴計算を対象画像内容ごとに人で判断して個々に決めるのは、全くうれしくない。 特徴量を自動で計算できるようなよい方法はないのか?