下面有两幅不同视角的图像,通过找出对应的角点进行匹配
我们可以直观的概括下角点所具有的特征:
轮廓之间的交点;
对于同一场景,即使视角发生变化,通常具备稳定性质的特征;
该点附近区域的像素点无论在梯度方向上还是其梯度幅值上有着较大变化;
移动窗口W,位移为(u,v),比较移动前后的像素变化
其中窗口函数可以是平坦的,也可以是高斯的如下图:
首先,将图像窗口平移[u,v]产生灰度变化的自相关函数如下:
经过一系列E(u,v)表达式的演化, E(u,v)表达式可以更新为:
其中矩阵M是2x2矩阵,可由图像的导数求得:
其中k是常量,一般取值为0.04~0.06,这个参数仅仅是这个函数的一个系数,它的存在只是调节函数的形状而已。
Harris角点检测器的响应函数会返回像素值为 Harris 响应函数值的一幅图像。
from PIL import Image
from numpy import *
from pylab import *
from scipy.ndimage import filtersdef compute_harris_response(im,sigma=3): #在灰度图像中计算每个像素的Harris的焦点响应函数# 计算导数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)#矩阵分量Wxx = filters.gaussian_filter(imx*imx,sigma)Wxy = filters.gaussian_filter(imx*imy,sigma)Wyy = filters.gaussian_filter(imy*imy,sigma)#特征值Wdet = Wxx*Wyy - Wxy**2Wtr = Wxx + Wyyreturn Wdet/Wtr
def get_harris_points(harrisim,min_dist=10,threshold=0.5):#挑选高于阈值corner_threshold = thresholdharrisim_t = (harrisim > corner_threshold) * 1#得到坐标coords = array(o()).T#响应值candidate_values = [harrisim[c[0],c[1]] for c in coords]#按照响应值排序index = argsort(candidate_values)[::-1]#将可行点的位置存放于数组allowed_locations = zeros(harrisim.shape)allowed_locations[min_dist:-min_dist,min_dist:-min_dist] = 1#选择最佳的角点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)] = 0return filtered_coords
def plot_harris_points(image,filtered_coords):#可视化figure(dpi = 1
本文发布于:2024-01-30 18:59:33,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170661237622150.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |