代码语言:javascript复制
import cv2
import numpy as np
from skimage.io import imread
from skimage.color import rgb2gray
from skimage.measure import ransac
from skimage.util import img_as_float
from matplotlib import pylab as pylab
from skimage.feature import corner_harris, corner_subpix, corner_peaks
from skimage.transform import warp, SimilarityTransform, AffineTransform,resize
from skimage.exposure import rescale_intensity
img=cv2.imread('C:/Users/xpp/Desktop/Lena.png')#原始图像
image_gray=rgb2gray(img)#将彩色图片转换为灰度图片
coordinates=corner_harris(image_gray, k =0.001)#Harris角点检测
coordinates[coordinates>0.03*coordinates.max()]=255#阈值
corner_coordinates=corner_peaks(coordinates)#计算Harris角点
coordinates_subpix=corner_subpix(image_gray,corner_coordinates,window_size=11)#计算角点的子像素位置
pylab.figure(figsize=(20,20))
pylab.subplot(211)
pylab.imshow(coordinates,cmap='inferno')
pylab.plot(coordinates_subpix[:,1],coordinates_subpix[:,0],'r.',markersize=5,label='subpixel')
pylab.legend(prop={'size':20})
pylab.axis('off')
pylab.subplot(212)
pylab.imshow(img,interpolation='nearest')
pylab.plot(corner_coordinates[:,1],corner_coordinates[:, 0],'bo',markersize=5)
pylab.plot(coordinates_subpix[:,1],coordinates_subpix[:, 0],'r ',markersize=10)
pylab.axis('off')
pylab.tight_layout()
pylab.show()
cv2.imshow('result',img)
算法:角点精确检测是以子像素的准确率对检测到的角点进行细化。
- 首先计算Harris角点
- 然后计算角点的子像素位置
- 最后,使用统计检验来决定是否接受或拒绝先前计算的角点
注意:设置搜索角点的邻域(窗口)的大小值。