Python計算機視覺——Harris角點檢測

專注的阿熊發表於2021-06-11

新建檔案 Harris_Detector.py

from pylab import *

from numpy import *

from scipy.ndimage import filters

def compute_harris_response(im,sigma=3):

     """ Compute the Harris corner detector response function

         for each pixel in a graylevel image. """

     # derivatives

     imx = zeros(im.shape)

     filters.gaussian_filter(im, (sigma,sigma), (0,1), imx)

     imy = zeros(im.shape)

     filters.gaussian_filter(im, (sigma,sigma), (1,0), imy)

     # compute components of the Harris matrix

     Wxx = filters.gaussian_filter(imx*imx,sigma)

     Wxy = filters.gaussian_filter(imx*imy,sigma)

     Wyy = filters.gaussian_filter(imy*imy,sigma)

     # determinant and trace

     Wdet = Wxx*Wyy - Wxy**2

     Wtr = Wxx + Wyy

     return Wdet / Wtr   

def get_harris_points(harrisim,min_dist=10,threshold=0.1):

     """ Return corners from a Harris response image

         min_dist is the minimum number of pixels separating

         corners and image boundary. """

     # find top corner candidates above a threshold

     corner_threshold = harrisim.max() * threshold

     harrisim_t = (harrisim > corner_threshold) * 1

     # get coordinates of candidates

     coords = array(harrisim_t.nonzero()).T

     # ...and their values

     candidate_values = [harrisim[c[0],c[1]] for c in coords]

     # sort candidates (reverse to get descending order)

     index = argsort(candidate_values)[::-1]

     # store allowed point locations in array

     allowed_locations = zeros(harrisim.shape)

     allowed_locations[min_dist:-min_dist,min_dist:-min_dist] = 1

     # select the best points taking min_distance into account

     filtered_coords = []

     for i in index:

         if allowed_locations[coords[i,0],coords[i,1]] == 1:

             filtered_coords.append(coords[i])

             allowed_locations[(coords[i,0]-min_dist):(coords[i,0]+min_dist),

                         (coords[i,1]-min_dist):(coords[i,1]+min_dist)] = 0

     return filtered_coords

def plot_harris_points(image,filtered_coords):

     """ Plots corners found in image. """

     figure()

     gray()

     imshow(image)

     plot([p[1] for p in filtered_coords],

                 [p[0] for p in filtered_coords],'*')

     axis('off')

     show()

上述三個函式分別代表這步驟中的 234 。外匯跟單gendan5.com 1 步驟則新建 test_harris.py

from PIL import Image

from numpy import *

# 這就是為啥上述要新建一個的原因,因為現在就可以 import

import Harris_Detector

from pylab import *

from scipy.ndimage import filters

# filename

im = array(Image.open(r"  ").convert('L'))

harrisim=Harris_Detector.compute_harris_response(im)

filtered_coords=Harris_Detector.get_harris_points(harrisim)

Harris_Detector.plot_harris_points(im,filtered_coords)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2776561/,如需轉載,請註明出處,否則將追究法律責任。

相關文章