2011-12-31 12 views
7

私は画像処理に新たなんだと、このイメージのコーナー検出を行うようになった任意の関連するモジュール内のコーナー検出のために必要なヘルプ: enter image description herePythonの画像処理:好ましくはPILや

この画像では、私は抽出する必要があります各線分の開始点と終了点、またはコーナーの座標を指定します。これは私のプロジェクトのほんの一部ですが、私は画像処理の経験がないのでこれに固執しています。

答えて

27

はここscikit-imageを使用して、ソリューションです:

from skimage import io, color, morphology 
from scipy.signal import convolve2d 
import numpy as np 
import matplotlib.pyplot as plt 

img = color.rgb2gray(io.imread('6EnOn.png')) 

# Reduce all lines to one pixel thickness 
snakes = morphology.skeletonize(img < 1) 

# Find pixels with only one neighbor 
corners = convolve2d(snakes, [[1, 1, 1], 
           [1, 0, 1], 
           [1, 1, 1]], mode='same') == 1 
corners = corners & snakes 

# Those are the start and end positions of the segments 
y, x = np.where(corners) 

plt.imshow(img, cmap=plt.cm.gray, interpolation='nearest') 
plt.scatter(x, y) 
plt.axis('off') 
plt.show() 

corners of line segments

+0

ニース - ここでコンボルブを大いに活用する - 私は8つの異なる '' np.rolls''を使って終わってしまったので、私はあなたの答えを読んだ方がいいです! ;) – pelson

+0

あなたが助けてくれてうれしい! –

1

私は質問を正しく理解するかどうかわかりませんが、効率の低い方法は各ピクセルをスキャンしてそのピクセルの周りの4方向を確認することです。正反対ではない2つの方向(すなわち、&が残されているか、または&の権利など)が着色されている場合、それはコーナーです。

これが役に立ちます。

+1

これは、線が1ピクセルの厚さであった場合に機能します。これはまれであり、サンプル画像も例外ではありません(ズームイン)。作業アルゴリズムはもっと複雑です([link](http://en.wikipedia.org/wiki/Corner_detection))。 –

+0

ありがとうございました。 @MaxLi –

0

これは暗いところでの少しのショットですが、画像の幅/高さを取得するためにpngヘッダーを解析することができます(this RFC for png detailsをご覧ください)。これを画像のビット深度と組み合わせると、各コーナーが単純な数式でどこにあるかを判断できるはずです。コーナーを見つけたら、隣接するピクセルデータをチェックする簡単なアルゴリズムを使ってラインをたどることができます。

これも宿題のようです。そうであれば、そのようにタグ付けする必要があります。

2

Harrisコーナー検出器とShi-Tomasiコーナー検出器の両方に付属するOpenCVの使用をお勧めします。

0

受け入れ答えは、画像内のすべてのコーナーを見つけることができません。 ハリスのコーナー検出を使用して

、1はすべて可能なコーナーを見つけることができます。 OPのモジュールの選択は制限されていないので、私はOpenCVライブラリを使用して以下を実行することにしました。

結果:

enter image description here

画像内に存在する一つ一つのコーナーが正しく識別されます。

THIS PAGEはアルゴリズムとコードの詳細を提供します。

関連する問題