欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Harris角点检测

程序员文章站 2023-12-25 18:22:27
...

目录

1.基本思想

2.不同类型的角点

3.数学表达

4.优化推导

5.代码实现

6.第一组场景结果截图与分析

7.第二组场景结果截图与分析

8.第三组场景结果截图与分析

10.在图像间寻找对应点

11.实验总结


1.基本思想

为了判断图像的角点,可以利用卷积窗口滑动的思想,让以该点为中心的窗口在附近滑动。如下图是所有描述角点文章的初始图例,它表征的正是这一特性:当滑动窗口在所有方向移动时,窗口内的像素灰度出现了较大的变化,就可能是角点。

Harris角点检测

2.不同类型的角点

Harris角点检测

3.数学表达

Harris角点检测

Harris角点检测

Harris角点检测

4.优化推导

Harris角点检测

Harris角点检测

Harris角点检测

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角点检测

 
该图片的最佳 Harris 点为Harris角点检测
 
 
(2)第一组场景第二幅图:
Harris角点检测
该图片的最佳 Harris 点为Harris角点检测
 
(3)第一组场景第三幅图:
Harris角点检测
该图片的最佳 Harris 点为Harris角点检测
 
(4)第一组场景第四幅图:
Harris角点检测
 
该图片的最佳 Harris 点为Harris角点检测
 
 
(5)第一组场景第五幅图:
Harris角点检测
该图片的最佳 Harris 点为Harris角点检测
 
(6)第一组场景结果分析
根据以上实验结果可知,其他条件不变的情况下,当使用的阈值越大,检测出来的角点越少。由上图也可知,垂直或水平边缘多的图片它所拥有的角点也比较多,比较密集。

7.第二组场景结果截图与分析

注:以下图使用的均为 Harris 角点检测器检测角点:每个图的第一幅为 Harris 响应函数;二、三、四分别为使用阈值0.01、0.05 和 0.1 检测出的角点

(1)第二组场景第一幅图:
Harris角点检测
该图片的最佳 Harris 点为Harris角点检测
 
(2)第二组场景第二幅图:
 
Harris角点检测
该图片的最佳 Harris 点为Harris角点检测
 
(3)第二组场景第三幅图:
Harris角点检测
该图片的最佳 Harris 点为Harris角点检测
 
(4)第二组场景第四幅图:
Harris角点检测
该图片的最佳 Harris 点为Harris角点检测
 
(5)第二组场景第五幅图:
Harris角点检测
该图片的最佳 Harris 点为Harris角点检测
(6)第二组场景结果分析
由上图可知,当图片处于远处拍摄时,角点相对较多;当处于近处拍摄时,角点相对较少。近处拍摄到的东西较少,远处的较多,因此远处更易于检测出角点,且距离的远近对检测角点有影响。
 

8.第三组场景结果截图与分析

注:以下图使用的均为 Harris 角点检测器检测角点:每个图的第一幅为 Harris 响应函数;二、三、四分别为使用阈值0.01、0.05 和 0.1 检测出的角点

(1)第三组场景第一幅图:
Harris角点检测
该图片的最佳 Harris 点为Harris角点检测
 
(2)第三组场景第二幅图:
 
Harris角点检测
该图片的最佳 Harris 点为Harris角点检测
 
(3)第三组场景第三幅图:
Harris角点检测
该图片的最佳 Harris 点为Harris角点检测
 
(4)第三组场景第四幅图:
Harris角点检测
该图片的最佳 Harris 点为Harris角点检测
 
(5)第三组场景第五幅图:
Harris角点检测
该图片的最佳 Harris 点为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)结果截图

 

Harris角点检测
Harris角点检测
Harris角点检测
Harris角点检测
Harris角点检测

 

结果分析:

由上图可知,该算法的结果存在一些不正确匹配。上图反映出角点检测不具有尺度不变性和旋转不变性,而算法中像素块的大小也会影响对应匹配的结果。

11.实验总结

通过本次实验,使我对Harris角点的检测有了更深一步的了解,对于图片的处理也有了更深一步的了解。当然,在实验时也发现了自己的不足之处,对代码的了解并不是很深,因此花了很多的时间来研究代码。

上一篇:

下一篇: