Harris角点特征提取和特征匹配(后半部分)

前半部分点击以下链接:
https://blog.csdn.net/QWER306306/article/details/123510826
本文采用Harris角点的方法来进行特征提取和特征匹配两大部分:
1.Harris角点特征提取:分为函数法和机理法(手工复现法)
2.Harris角点特征匹配:先让两张图片进行特征提取,再将图一和图二的每一个点进行做相关运算,若两张图角点的相关度都是最大的,则将两张图的角点相匹配。

提示:以下程序是顺序的,要一一复制进行运行,目录需要自己更改,部分参数针对不同的图片,也要做出相应的改变

目录

  • Harris角点特征提取和特征匹配(后半部分)
  • Part2. Harris角点特征匹配
    • 第一步:提取两张图片的角点
    • 第二步:返回角点的坐标值和角点周围的像素值
    • 第三步:比较两张图片角点相互之间的相关性
    • 第四步:改进
    • 第五步:连接最终相关度大于一定值的角点
    • 主函数

Part2. Harris角点特征匹配

目的:将两张不同角度的图片特征一样的地方匹配起来

  1. 先根据上述的角点特征提取方法,求得两张图片的角点(大于设定阈值的点)
  2. 返回角点的坐标值
  3. 返回两张图片角点附件点的像素值
  4. 根据两张图角点周围的像素点,比较两张图片角点相互之间的相关性,在图二中,找出与图一各点相关度最大的点的位置
  5. 改进:在图一中,找出与图二各点相关度最大的点的位置,然后和上面的方法进行加权,若两次匹配的相关度都大于一定值才会匹配

第一步:提取两张图片的角点

img_c1=cv2.imread('D:/classofmathpicture/house1.png',0)
img_c1_CC=cv2.imread('D:/classofmathpicture/house1.png',1)
img_c1_CC=cv2.cvtColor(img_c1_CC,cv2.COLOR_BGR2RGB)
Harris_c1 = cv2.cornerHarris(img_c1, 3, 3, 0.04)
dst_c1 = cv2.dilate(Harris_c1, None)  #将可以标出来的点粗化
plt.figure(figsize=(20, 20));
img_c1_C=img_c1_CC.copy()
thres = 0.1*dst_c1.max()
img_c1_C[dst_c1 > thres] = [255,0,0]
plt.subplot(121);plt.imshow(img_c1_C);plt.title('c1');plt.axis('off');img_c2=cv2.imread('D:/classofmathpicture/house1_c.png',0)
img_c2_CC=cv2.imread('D:/classofmathpicture/house1_c.png',1)
img_c2= cv2.resize(img_c2, (int(img_c1.shape[1]), int(img_c1.shape[0])))
img_c2_CC = cv2.resize(img_c2_CC, (int(img_c1_CC.shape[1]), int(img_c1_CC.shape[0])))
img_c2_CC=cv2.cvtColor(img_c2_CC,cv2.COLOR_BGR2RGB)
# img_house_C_fuction=img_house_C.copy()
Harris_c2 = cv2.cornerHarris(img_c2, 3, 3, 0.04)
dst_c2 = cv2.dilate(Harris_c2, None)  #将可以标出来的点粗化
img_c2_C=img_c2_CC.copy()
thres = 0.05*dst_c2.max()
img_c2_C[dst_c2 > thres] = [255,0,0]
plt.subplot(122);plt.imshow(img_c2_C);plt.title('c2');plt.axis('off');

第二步:返回角点的坐标值和角点周围的像素值

# 从一幅Harris响应图像中返回角点,min_dist为分割角点和图像边界的最少像素数目
def get_harris_points(harrisim,min_dist=10,threshold=0.1):   # 寻找高于阈值的候选角点corner_threshold = harrisim.max() * thresholdharrisim_t = (harrisim > corner_threshold) * 1  # 得到候选点的坐标coords = array(harrisim_t.nonzero()).T  # 以及它们的 Harris 响应值candidate_values = [harrisim[c[0],c[1]] for c in coords]   # 对候选点按照 Harris 响应值进行排序index = argsort(candidate_values)[::-1] # 将可行点的位置保存到数组中allowed_locations = zeros(harrisim.shape)allowed_locations[min_dist:-min_dist,min_dist:-min_dist] = 1    # 按照 min_distance 原则,选择最佳 Harris 点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)] = 0    return filtered_coords#对于每个返回的点,返回点周围2*wid+1个像素的值(假设选取点的min_distance > wid)
def get_descriptors(image, filtered_coords, wid=5):desc = []for coords in filtered_coords:patch = image[coords[0] - wid:coords[0] + wid + 1,coords[1] - wid:coords[1] + wid + 1].flatten()desc.append(patch)return desc

第三步:比较两张图片角点相互之间的相关性

根据两张图角点周围的像素点,比较两张图片角点相互之间的相关性,在图二中,找出与图一各点相关度最大的点的位置

#对于第一幅图像中的每个角点描述子,使用归一化互相关,选取它在第二幅图像中的匹配角点
def match(desc1, desc2, threshold=0.5):n = len(desc1[0])# 点对的距离d = -ones((len(desc1), len(desc2)))for i in range(len(desc1)):for j in range(len(desc2)):d1 = (desc1[i] - mean(desc1[i])) / std(desc1[i])d2 = (desc2[j] - mean(desc2[j])) / std(desc2[j])ncc_value = sum(d1 * d2) / (n - 1)if ncc_value > threshold:d[i, j] = ncc_valuendx = argsort(-d)   #从大0到小排序matchscores = ndx[:, 0]   #最大一个数的位置坐标return matchscores

第四步:改进

改进:在图一中,找出与图二各点相关度最大的点的位置,然后和上面的方法进行加权,若两次匹配的相关度都大于一定值才会匹配

#两边对称版本的match()
def match_twosided(desc1, desc2, threshold=0.5):matches_12 = match(desc1, desc2, threshold)matches_21 = match(desc2, desc1, threshold)ndx_12 = where(matches_12 >= 0)[0]# 去除非对称的匹配for n in ndx_12:if matches_21[matches_12[n]] != n:matches_12[n] = -1return matches_12

第五步:连接最终相关度大于一定值的角点

#返回将两幅图像并排拼接成的一幅新图像
def appendimages(im1, im2):row1 = im1.shape[0]row2 = im2.shape[0]if row1 < row2:im1 = concatenate((im1, zeros((row2 - row1, im1.shape[1]))), axis=0)elif row1 > row2:im2 = concatenate((im2, zeros((row1 - row2, im2.shape[1]))), axis=0)return concatenate((im1, im2), axis=1)#显示一幅带有连接匹配之间连线的图片
#输入:im1,im2(数组图像),locs1,locs2(特征位置),matchscores(match的输出),
def plot_matches(im1, im2, locs1, locs2, matchscores):im3 = appendimages(im1, im2)imshow(im3)cols1 = im1.shape[1]for i, m in enumerate(matchscores):if m > 0:plot([locs1[i][1], locs2[m][1] + cols1], [locs1[i][0], locs2[m][0]], 'c')axis('off')

主函数

from pylab import *
from numpy import *
wid=9   #比较像素点数目
filtered_coords1 = get_harris_points(dst_c1, wid+1,0.1)   #图1大于阈值的坐标
filtered_coords2 = get_harris_points(dst_c2, wid+1,0.1)   #图2大于阈值的坐标
d1 = get_descriptors(img_c1_CC, filtered_coords1, wid)
d2 = get_descriptors(img_c2_CC, filtered_coords2, wid)
matches = match_twosided(d1, d2,0.8)                 #图1的阈值点与图二哪个阈值点相关度最高,输出与图一相关性最大点的坐标
plt.figure(figsize=(30, 20));
plot_matches(img_c1_CC, img_c2_CC,filtered_coords1, filtered_coords2, matches)


plt.figure(figsize=(20, 30));
for i in range(4):matches = match_twosided(d1, d2,0.6+0.1*i)plt.subplot(4,1,i+1);plot_matches(img_c1_CC, img_c2_CC,filtered_coords1, filtered_coords2, matches);plt.title('thres= %1.1f'%(0.6+0.1*i));



plt.figure(figsize=(20, 30));
for i in range(4):wid=5+2*i   #比较像素点数目filtered_coords1 = get_harris_points(dst_c1, wid+1)   #图1大于阈值的坐标filtered_coords2 = get_harris_points(dst_c2, wid+1)   #图2大于阈值的坐标d1 = get_descriptors(img_c1_CC, filtered_coords1, wid)d2 = get_descriptors(img_c2_CC, filtered_coords2, wid)matches = match_twosided(d1, d2,0.7)plt.subplot(4,1,i+1);plot_matches(img_c1_CC, img_c2_CC,filtered_coords1, filtered_coords2, matches);plt.title('num= %1.1f'%(1+2*i));


Harris角点特征提取和角点特征匹配(2)相关推荐

  1. 计算机视觉学习2_局部图像描述子_SIFT算法_特征匹配_集美大学地标

    文章目录 相关环境的搭建 原理部分 Harris角点检测算法 SIFT(尺度不变特征变换) 尺度不变性 实验部分 Harris和sift特征匹配处理 结果对比 集美大学小地图 相关环境的搭建 1.PC ...

  2. OpenCV-图像特征harris角点检测/SIFT函数/特征匹配-05

    图像特征-harris角点检测 基本原理 R>0 角点 R≈0 平坦区域 R<0 边界 总结一下Harris算法流程 获取点数据后,计算Ix 和 Iy 整合矩阵,求特征值 比较特征值大小 ...

  3. Harris的角点检测和特征匹配

    一.特征检测(提取) 基于特征的图像配准方法是图像配准中最常见的方法之一.它不是直接利用图像像素值,二十通过像素值导出的符号特征(如特征点.特征线.特征区域)来实现图像配准,因此可以克服利用灰度信息进 ...

  4. 学习笔记 2.1 — Harris角点检测与特征匹配【含实例】

    一. 图像特征匹配 最近刚入门了计算机视觉这门课程,觉得非常有意思,想象一下如果你能够自己做出一款全景拍照的软件,真实地令人激动,当然这全景图像其中的原理就是图像的特征匹配,把不同的图片通过相同的局部 ...

  5. 角点检测——发现图像的特征

    文章目录 写在最前 角点检测是什么?有什么用? OpenCV中的角点检测 Harris角点检测 Shi-Tomasi 角点检测 特征检测,从ORB说起 写在最后 往期文章 下载 写在最前 不知不觉,漫 ...

  6. 光流 | 图像特征匹配:特征光流与角点特征

    /********************************************************** github:https://github.com/MichaelBeechan ...

  7. opencv3/C++ Harris角点、Shi-Tomasi角点亚像素角点

    角点检测在图像匹配.目标识别.目标跟踪.运动估计与三维重建等CV领域起着非常重要的作用. 角点定义 关于角点的定义有以下几种: 1.角点是两条及两条以上的边缘的交点: 2.角点处的一阶导数最大,二阶导 ...

  8. OpenCV特征检测,角检测,特征点检测,特征匹配,对象查找

    特征检测 图像的特征是指图像中具有独特性和易于识别性的区域,角.边缘等都属于有意义的特征. 8.1角检测 角是两条边的交点,也可称为角点或拐角,它是图像中各个方向上强度变化最大的区域. OpenCV的 ...

  9. 【理解】ORB特征提取与ORBSLAM特征匹配简要剖析

    目录 ORB特征提取 优势: 经典FAST特征提取: 经典的BRIEF描述子: ORB特征提取的改进: 如何在FAST检测的基础上维持特征点的尺度不变性? 如何在FAST检测的基础上维持特征点的旋转不 ...

最新文章

  1. linux redis 设置日志,linux上redis怎么动态看日志
  2. 2021-03-12java性能调优三板斧
  3. 项目交付为什么失败?-记我在某个项目中的迷思
  4. 犯了一个连接数据库的低级错误
  5. FreeRTOS任务通知
  6. vim简单命令教程-firstblood
  7. aes 加密_PHP使用AES加密和解密
  8. R语言入门:R、R Studio的安装配置【多图详解、保姆级教程】
  9. ckplayer php,ckplayer播放器
  10. 深入Marlin固件
  11. Jetpack之LiveData
  12. An operation on a socket could not be performed because the system lacked sufficient buffer space or
  13. Magento2.1x常见报错处理
  14. 微软与网景关于浏览器的恩怨情仇
  15. 史上最简单的 MySQL 教程
  16. 前端常用的超赞的配色网站
  17. 白帽汇赵武:我们来聊一聊实名制
  18. 物联网感知——视频监控技术
  19. 24.大数据---Hive的连接三种连接方式
  20. C语言咪咪数学宝涉及到的知识点,C语言编程 做一个设计一个儿童算数教学程序:“咪咪数学宝”...

热门文章

  1. 数据库 --关联查询(多表查询)
  2. 中国漆画名品东京展出 促中日文化交流
  3. Matplotlib绘制图片——膨胀算法
  4. QTableView添加复选框
  5. CheckBoxList复选框例子
  6. Oracle dba培训教程 第一章 Oracle的体系结构
  7. intell idea 快速启动设置
  8. [Java经典题目] 随机得到一个[ 1-100]之间的年龄
  9. 微信开发者工具的使用(一)
  10. 小试牛刀之NunJucks模板引擎