Harris角点检测
程序员文章站
2023-12-25 18:22:27
...
目录
1.基本思想
为了判断图像的角点,可以利用卷积窗口滑动的思想,让以该点为中心的窗口在附近滑动。如下图是所有描述角点文章的初始图例,它表征的正是这一特性:当滑动窗口在所有方向移动时,窗口内的像素灰度出现了较大的变化,就可能是角点。
2.不同类型的角点
3.数学表达
4.优化推导
5.代码实现
# -*- coding: utf-8 -*-
from pylab import *
from PIL import Image
from PCV.localdescriptors import harris
from numpy import *
"""
Example of detecting Harris corner points (Figure 2-1 in the book).
"""
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"C:\windows\fonts\SimSun.ttc", size=14)
# 读入图像
im = array(Image.open('D:\JMU\computer_vision\experience2\scene1.jpg').convert('L'))
# 检测harris角点
harrisim = harris.compute_harris_response(im)
# Harris响应函数
harrisim1 = 255 - harrisim
gray()
#画出Harris响应图
subplot(221)
title(u'Harris响应图',fontproperties=font)
imshow(harrisim1)
print harrisim1.shape
print harrisim
axis('off')
axis('equal')
threshold = [0.01, 0.05, 0.1]
for i, thres in enumerate(threshold):
filtered_coords = harris.get_harris_points(harrisim, 6, thres)
subplot(2, 2, i+2)
imshow(im)
print im.shape
plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
axis('off')
#原书采用的PCV中PCV harris模块
#harris.plot_harris_points(im, filtered_coords)
# plot only 200 strongest
# harris.plot_harris_points(im, filtered_coords[:200])
show()
6.第一组场景结果截图与分析
注:以下图使用的均为 Harris 角点检测器检测角点:每个图的第一幅为 Harris 响应函数;二、三、四分别为使用阈值0.01、0.05 和 0.1 检测出的角点
(1)第一组场景第一幅图
该图片的最佳 Harris 点为
(2)第一组场景第二幅图:
该图片的最佳 Harris 点为
(3)第一组场景第三幅图:
该图片的最佳 Harris 点为
(4)第一组场景第四幅图:
该图片的最佳 Harris 点为
(5)第一组场景第五幅图:
该图片的最佳 Harris 点为
(6)第一组场景结果分析
根据以上实验结果可知,其他条件不变的情况下,当使用的阈值越大,检测出来的角点越少。由上图也可知,垂直或水平边缘多的图片它所拥有的角点也比较多,比较密集。
7.第二组场景结果截图与分析
注:以下图使用的均为 Harris 角点检测器检测角点:每个图的第一幅为 Harris 响应函数;二、三、四分别为使用阈值0.01、0.05 和 0.1 检测出的角点
(1)第二组场景第一幅图:
该图片的最佳 Harris 点为
(2)第二组场景第二幅图:
该图片的最佳 Harris 点为
(3)第二组场景第三幅图:
该图片的最佳 Harris 点为
(4)第二组场景第四幅图:
该图片的最佳 Harris 点为
(5)第二组场景第五幅图:
该图片的最佳 Harris 点为
(6)第二组场景结果分析
由上图可知,当图片处于远处拍摄时,角点相对较多;当处于近处拍摄时,角点相对较少。近处拍摄到的东西较少,远处的较多,因此远处更易于检测出角点,且距离的远近对检测角点有影响。
8.第三组场景结果截图与分析
注:以下图使用的均为 Harris 角点检测器检测角点:每个图的第一幅为 Harris 响应函数;二、三、四分别为使用阈值0.01、0.05 和 0.1 检测出的角点
(1)第三组场景第一幅图:
该图片的最佳 Harris 点为
(2)第三组场景第二幅图:
该图片的最佳 Harris 点为
(3)第三组场景第三幅图:
该图片的最佳 Harris 点为
(4)第三组场景第四幅图:
该图片的最佳 Harris 点为
(5)第三组场景第五幅图:
该图片的最佳 Harris 点为
(6)第三组场景结果分析
由上图可知,当图片处于不同的亮度情况下拍出来的照片,所检测出来的角点也相对不同。当处于自然光照亮的情况下,亮度越大,角点也越多。
10.在图像间寻找对应点
(1)Harris角点检测器可以给出图像中检测到兴趣点,但它并没有提供在图像间对兴趣点进行比较的方法,我们需要在每个角点添加描述子,以及对这些描述子进行比较。
(2)代码
# -*- coding: utf-8 -*-
from pylab import *
from PIL import Image
from PCV.localdescriptors import harris
from PCV.tools.imtools import imresize
"""
This is the Harris point matching example in Figure 2-2.
"""
# Figure 2-2上面的图
#im1 = array(Image.open("../data/crans_1_small.jpg").convert("L"))
#im2= array(Image.open("../data/crans_2_small.jpg").convert("L"))
# Figure 2-2下面的图
im1 = array(Image.open("D:\JMU\computer_vision\experience2\scene2.jpg").convert("L"))
im2 = array(Image.open("D:\JMU\computer_vision\experience2\scene3.jpg").convert("L"))
# resize加快匹配速度
im1 = imresize(im1, (im1.shape[1]/2, im1.shape[0]/2))
im2 = imresize(im2, (im2.shape[1]/2, im2.shape[0]/2))
wid = 5
harrisim = harris.compute_harris_response(im1, 5)
filtered_coords1 = harris.get_harris_points(harrisim, wid+1)
d1 = harris.get_descriptors(im1, filtered_coords1, wid)
harrisim = harris.compute_harris_response(im2, 5)
filtered_coords2 = harris.get_harris_points(harrisim, wid+1)
d2 = harris.get_descriptors(im2, filtered_coords2, wid)
print 'starting matching'
matches = harris.match_twosided(d1, d2)
figure()
gray()
harris.plot_matches(im1, im2, filtered_coords1, filtered_coords2, matches)
show()
(3)结果截图
结果分析:
由上图可知,该算法的结果存在一些不正确匹配。上图反映出角点检测不具有尺度不变性和旋转不变性,而算法中像素块的大小也会影响对应匹配的结果。
11.实验总结
通过本次实验,使我对Harris角点的检测有了更深一步的了解,对于图片的处理也有了更深一步的了解。当然,在实验时也发现了自己的不足之处,对代码的了解并不是很深,因此花了很多的时间来研究代码。