图像特征提取与描述

1.角点是图片的重要区分特点,利用好角点容易区分图像的特征

2.Harris算法和shi-Tomas算法:都是利用角点检测来判断角点,边界以及平坦区域

3.Harris算法是通过R的值来判断角点,边界以及平坦区域

R = 矩阵行列式M - M的轨迹的平方

当R是一个数值大的正数时,它是角点

当R是一个数值大的负数时,它是边界

当R是小数时,它是平坦区域

API:cv.cornerHarris(src,blackSize,ksize,k)

复制代码
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#读取图像并转换为灰色图
img = cv.imread('image1.jpg')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#输入图像必须为floate32
gray = np.float32(gray)
dst = cv.cornerHarris(gray,2,3,0.04)
#2为blockSize为领域大小,也就是窗口
#3为sobel求导时使用核大小
#角点赋值红色
img[dst>0.001*dst.max()] = [0,0,255]
plt.imshow(img[:,:,::-1])
plt.show()
复制代码

4.shi-tomas角点检测比Harris更好找到角点,若矩阵两个特征值中较小的一个大于阈值,则认为它是角点

2.判断角点方法:

1)如果两个都大于阈值就是角点

2)如果一个大于阈值就是边界

3)如果都小于阈值就是平坦区域

1)API:coeners = cv.goodFeaturesToTrace(img,maxcorners,qualityLevel,minDistance)

复制代码
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#读取图像并转换为灰色图
img = cv.imread('image1.jpg')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
corners = cv.goodFeaturesToTrack(gray,1000,0.01,10)
for i in corners:
    x,y = i.ravel()
    cv.circle(img,(x,y),2,(0,0,255),-1)
plt.imshow(img[:,:,::-1])
plt.show()
复制代码

5.SIFT算法和SURF算法:不仅具有Harris算法的旋转不变性还具有尺度不变性

1.实例化SIFT

sift = cv.xfeatures2d.SIFT_create()

2.利用sift.detectAndCompute()检测关键点并计算

kp,des = sift,detectAndCompute(gray,None)

3.将关键点检测结果绘制在图像上

cv.drawKeypoints(image,keypoints,outpoints,color,flags)

复制代码
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#1.读取图像并转换为灰色图
img = cv.imread('image1.jpg')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#2.关键点检测
#2.1.实例化sift对象
#sift = cv.xfeatures2d.SIFT_create()
#改进为
sift = cv.SIFT_create()
#2.2.关键点检测,kp包括方向,尺度,位置信息,des关键点描述
kp,des = sift.detectAndCompute(gray,None)
#2.3.绘制关键点检测结果
cv.drawKeypoints(img,kp,img,cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.imshow(img[:,:,::-1])
plt.show()
复制代码

6.Fast算法和ORB算法:

FAST算法的角点检测就是一个像素周围有一定数量的像素与该点的像素值不同,则认为其为角点

1).实例化fast对象

fast = cv.FastfeatureDetector_create(threshold,nonmaxSuppression)

2).利用fast.detect检测关键点

kp = fast.detect(grayImg,None)

3).检测结果绘制在图像上

cv.drawKeypoints(img,keypoints,outpoints,color,flags)

复制代码
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#1.读取图像
img = cv.imread('image1.jpg')
#2.实例化fast对象
fast = cv.FastFeatureDetector_create(threshold=30)
#3.利用fast.detect检测关键点
kp = fast.detect(img,None)
#4.将关键点绘制在图像上
img = cv.drawKeypoints(img,kp,None,color=(0,0,255),flags=0)
plt.imshow(img[:,:,::-1])
plt.show()
复制代码

ORB算法是基于FAST算法和Brief算法的,构造金字塔,为fast算法构造方向

1)实例化ORB

orb = cv.orb_create(nfeatures)

2)利用orb.detectAndCompute()检测关键地点并计算

kp,des = orb.detectAndCompute(gray,None)

3)将关键点检测结果绘制图像上

cv.drawKeypoints(img,keypoints,outpoints,color,flags)

复制代码
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#1.读取图像
img = cv.imread('image1.jpg')
#2.实例化orb对象
orb = cv.ORB_create(nfeatures=5000)#特征点最大数量
#3.利用orb.detectAndCompute检测关键点并计算
kp,des = orb.detectAndCompute(img,None)
#4.将关键点绘制在图像上
img = cv.drawKeypoints(img,kp,None,color=(0,0,255),flags=0)
plt.imshow(img[:,:,::-1])
plt.show()
复制代码

 



posted @   求知律己  阅读(482)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示