2017-04-20 97 views
0

哈里斯角落探測器哈里斯角落探測器python

我想執行哈里斯角探測器與python的方法,但我卡住請給一些建議。 ,我已經實現的方法可以發現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的解決方案? –

回答

0

顯然,有PIL中沒有可用的直接功能,以識別圖像中的角落。我,但是發現,THIS LINK。看看它是否適合你。

最好的辦法就是使用OpenCV的內置函數,這會給出相當好的結果。

THIS PAGE提供了另一種方式找到的角落使用scikit image Python模塊