2017-04-20 13 views
0

ハリスコーナー検出器ハリスコーナー検出器のpython

私のpythonとハリスコーナー検出器のメソッドを実装したいが、私はいくつかのアドバイスをお願いし立ち往生しています。私が何をしたいのexempleある 私が実装した方法がHERE

import numpy as np 
import matplotlib.pyplot as plt 
from PIL.Image import * 
import scipy 
from scipy import ndimage, signal 


def conv2(x, y, mode='same'): 
    return np.rot90(signal.convolve2d(np.rot90(x, 2), np.rot90(y, 2), mode=mode), 2) 

def harris(im): 
    l, c = im.size 
    k = 0.04 
    imarr = np.asarray(im, dtype=np.float64) 
    dx = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=np.float64) 
    dy = dx.transpose() 
    mat3x3 = np.array([[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]], dtype=np.float64) 
    for i in range(0, (c-3), 2): 
     for j in range(0, (l-3), 2): 
      mat3x3[0, 0] = imarr[i, j] 
      mat3x3[0, 1] = imarr[i, j+1] 
      mat3x3[1, 0] = imarr[i, j+2] 
      mat3x3[1, 1] = imarr[i+1, j] 
      mat3x3[1, 1] = imarr[i+1, j+1] 
      mat3x3[0, 0] = imarr[i+1, j+2] 
      mat3x3[0, 0] = imarr[i+2, j] 
      mat3x3[0, 0] = imarr[i+2, j+1] 
      mat3x3[0, 0] = imarr[i+2, j+2] 
      Ix = conv2(mat3x3, dx, mode='same') 
      Iy = conv2(mat3x3, dy, mode='same') 
      Ix2 = Ix * Ix 
      Iy2 = Iy * Iy 
      Ixy = Ix * Iy 
      Sx2 = conv2(mat3x3, Ix2, mode='same') 
      Sy2 = conv2(mat3x3, Iy2, mode='same') 
      Sxy = conv2(mat3x3, Ixy, mode='same') 
      Hxy = [[Sx2, Sxy], [Sy2, Sxy]] 
      R = np.linalg.det(Hxy) - k*(np.power((np.linalg.eig(Hxy)), 2)) 
      # print(R[0, 0]) 
      if(R[0, 0] > 0): 
       imarr[i, j] = 127 
       imarr[i, j+1] = 127 
       imarr[i, j+2] = 127 
       imarr[i, j+3] = 127 
       imarr[i+1, j] = 127 
       imarr[i+1, j+1] = 127 
       imarr[i+1, j+2] = 127 
       imarr[i+1, j+3] = 127 
       imarr[i+2, j] = 127 
       imarr[i+2, j+1] = 127 
       imarr[i+2, j+2] = 127 
       imarr[i+2, j+3] = 127 
       imarr[i+3, j] = 127 
       imarr[i+3, j+1] = 127 
       imarr[i+3, j+2] = 127 
       imarr[i+3, j+3] = 127 
    return imarr 

im = open('chess.png') 
em = harris(im) 
plt.imshow(em, 'gray') 
plt.show() 

を見つけることができます:harris exempe

+0

はPILでソリューションを考え出しscikit imageのpythonモジュールを使用してコーナーを見つけるための別の方法を提供しますか? –

答えて

0

どうやら、画像内のコーナーを検出するために、PILで使用可能なダイレクト機能がありません。しかし、私は見つけた、THIS LINK。それがあなたに合っているかどうか見てください。

あなたの最善の策は、OpenCVの組み込み関数を使うことです。これはかなり良い結果をもたらします。

THIS PAGE

関連する問題