哈里斯角落探测器

我想用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

最佳答案

def Harris():
    if im == None:
        msg.showerror('error', 'Ouvrire une image')
        return 0
    msg.showinfo('wait', 'Le programme traite l\'image, veuillez patienter')
    global em
    neim = imap1()
    imarr = np.asarray(neim, dtype=np.float64)
    ix = ndimage.sobel(imarr, 0)
    iy = ndimage.sobel(imarr, 1)
    ix2 = ix * ix
    iy2 = iy * iy
    ixy = ix * iy
    ix2 = ndimage.gaussian_filter(ix2, sigma=2)
    iy2 = ndimage.gaussian_filter(iy2, sigma=2)
    ixy = ndimage.gaussian_filter(ixy, sigma=2)
    c, l = imarr.shape
    result = np.zeros((c, l))
    r = np.zeros((c, l))
    rmax = 0
    for i in range(c):
        print('loking for corner . . .')
        for j in range(l):
            print('test ', j)
            m = np.array([[ix2[i, j], ixy[i, j]], [ixy[i, j], iy2[i, j]]], dtype=np.float64)
            r[i, j] = np.linalg.det(m) - 0.04 * (np.power(np.trace(m), 2))
            if r[i, j] > rmax:
                rmax = r[i, j]
    for i in range(c - 1):
        print(". .")
        for j in range(l - 1):
            print('loking')
            if r[i, j] > 0.01 * rmax and r[i, j] > r[i - 1, j - 1] and r[i, j] > r[i - 1, j + 1] \
                    and r[i, j] > r[i + 1, j - 1] and r[i, j] > r[i + 1, j + 1]:
                result[i, j] = 1
    result = np.transpose(result)
    pc, pr = np.where(result == 1)
    base = plt.gca().transData
    rot = transforms.Affine2D().rotate_deg(270)
    plt.plot(pr, pc, 'r', transform=rot + base, linestyle="None", marker="o", markersize=1)
    plt.savefig('harris_test.png')
    root_analy.geometry("1108x553+85+50")
    frame_active.configure(width=1108, height=40)
    # ---------- frame de present l'image filter------------------
    frame_image_fil = Frame(root_analy)
    frame_image_fil.configure(width=500, height=470)
    frame_image_fil.place(x=605, y=42)
    frame_image_fil.configure(borderwidth=2, relief=GROOVE)
    # --------- frame de title de image resultat ---------------
    frame_imgreslt = Frame(root_analy)
    frame_imgreslt.configure(width=500, height=40, bg='#1B3F5D')
    frame_imgreslt.place(x=760, y=512)
    frame_imgreslt.configure(borderwidth=2, relief=GROOVE)
    label_title1 = Label(frame_imgreslt, text='les point d\'intérêt', font=("Courier", 18), bg='#0F2130', foreground="#4F5459")
    label_title1.pack()
    img = open('harris_test.png')
    em = img
    img = img.resize((491, 458), ANTIALIAS)
    img = ImageTk.PhotoImage(img)
    pano = Label(frame_image_fil)
    pano.configure(image=img)
    pano.image = img
    pano.place(x=0, y=0)
    os.remove('harris_test.png')
    return 0

10-04 18:47