0
点赞
收藏
分享

微信扫一扫

计算机视觉(二)

程序员漫画编程 2022-03-31 阅读 158

计算机视觉(二)图像局部描述符

1.Harris角点检测器

Harris 角点检测算法(也称 Harris & Stephens 角点检测器)是一个极为简单的角点
检测算法。该算法的主要思想是,如果像素周围显示存在多于一个方向的边,我们
认为该点为兴趣点。该点就称为角点

上述的定义说是不是觉得很深奥?稍微有点看不懂?那么,这里给出比较简单的例子来帮助我们理解
如下图所示:
在这里插入图片描述
我们可以直观的概括下角点所具有的特征:

2. 什么是好的角点检测算法?

在这里插入图片描述

3.Harris角点检测算法基本思想是什么?

在这里插入图片描述
在这里插入图片描述

4.如何用数学公式的方法描述角点

在这里插入图片描述
经过一系列E(u,v)表达式的演化, E(u,v)表达式可以更新为:
在这里插入图片描述
在这里插入图片描述

5. 如何用度量角点响应?

在这里插入图片描述
在这里插入图片描述

6.Harris角点检测器实例

以下采用此图片进行测试:
在这里插入图片描述
代码:

from pylab import *
from PIL import Image
from PCV.localdescriptors import harris

# 读入图像
im = array(Image.open('测试图片2.jpg').convert('L'))
# 检测harris角点
harrisim = harris.compute_harris_response(im)
# Harris响应函数
harrisim1 = 255 - harrisim

figure()
gray()

# 画出Harris响应图
subplot(141)
imshow(harrisim1)
print(harrisim1.shape)
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(1, 4, i + 2)
    imshow(im)
    print(im.shape)
    plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
    axis('off')

show()


运行结果:
在这里插入图片描述
在这里插入图片描述
结果分析:
增大α的值,将减小角点响应值R,降低角点检测的灵性,减少被检测角点的数量;减小α值,将增大角点响应值R,增加角点检测的灵敏性,增加被检测角点的数量。使用阈值 0.01、0.05 和 0.1 检测出的角点依次减少。

7.图像中寻找对应点

Harris 角点检测器仅仅能够检测出图像中的兴趣点,但是没有给出通过比较图像间
的兴趣点来寻找匹配角点的方法。我们需要在每个点上加入描述子信息,并给出一
个比较这些描述子的方法。

兴趣点描述子是分配给兴趣点的一个向量,描述该点附近的图像的表观信息。描述
子越好,寻找到的对应点越好。我们用对应点或者点的对应来描述相同物体和场景
点在不同图像上形成的像素点。

代码:

from pylab import *
from PIL import Image
from PCV.localdescriptors import harris
from PCV.tools.imtools import imresize

im1 = array(Image.open("测试图片2.JPG").convert("L"))
im2 = array(Image.open("测试图片3.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()

运行结果:
在这里插入图片描述
结果分析:
如图所示,匹配的结果并不能完全一致,还是存在一定的误差的。这是因为,与现代的一些方法
相比,图像像素块的互相关矩阵具有较弱的描述性。实际运用中,我们通常使用更稳健的方法来处理这些对应匹配。这些描述符还有一个问题,它们不具有尺度不变性和旋转不变性,而算法中像素块的大小也会影响对应匹配的结果。

8.SIFT(尺度不变特征变换)

什么是SIFT算法?
SIFT即尺度不变特征变换,是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子

8.1 SIFT算法可以解决的一些问题

在这里插入图片描述

8.2 SIFT算法实现的细节(步骤)

在这里插入图片描述

8.3 哪些点是SIFT中要查找的关键点(特征点) ?

  1. 尺度
  2. 方向
  3. 位移
  4. 光照
    在这里插入图片描述

8.4 什么是尺度空间?

尺度空间理论最早于1962年提出,其主要思想是通过对原始图像进行尺度变换,获得图像多尺度下的空间表示。从而实现边缘、角点检测和不同分辨率上的特征提取,以满足特征点的尺度不变性。尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。尺度越大图像越模糊。
在这里插入图片描述

8.5 SIFI算法的实例

采用的两张图片:
在这里插入图片描述
在这里插入图片描述

代码:

from PIL import Image
from pylab import *
import sys
from PCV.localdescriptors import sift

if len(sys.argv) >= 3:
    im1f, im2f = sys.argv[1], sys.argv[2]
else:
    im1f = '测试图片2.jpg'
    im2f = '测试图片3.jpg'
im1 = array(Image.open(im1f))
im2 = array(Image.open(im2f))

sift.process_image(im1f, 'out_sift_1.txt')
l1, d1 = sift.read_features_from_file('out_sift_1.txt')
figure()
gray()
subplot(121)
sift.plot_features(im1, l1, circle=False)

sift.process_image(im2f, 'out_sift_2.txt')
l2, d2 = sift.read_features_from_file('out_sift_2.txt')
subplot(122)
sift.plot_features(im2, l2, circle=False)

# matches = sift.match(d1, d2)
matches = sift.match_twosided(d1, d2)
print('{} matches'.format(len(matches.nonzero()[0])))

figure()
gray()
sift.plot_matches(im1, im2, l1, l2, matches, show_below=True)
show()

运行结果:
在这里插入图片描述

举报

相关推荐

0 条评论