简述电子商务网站的建设步骤,信誉好的苏州网站建设,搜索引擎网站建设,简述网站开发的步骤学习目标
理解Harris和Shi-Tomasi算法的原理能够利用Harris和Shi-Tomasi进行角点检测 1 Harris角点检测
1.1 原理 H a r r i s Harris Harris角点检测的思想是通过图像的局部的小窗口观察图像#xff0c;角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化#xff…学习目标
理解Harris和Shi-Tomasi算法的原理能够利用Harris和Shi-Tomasi进行角点检测 1 Harris角点检测
1.1 原理 H a r r i s Harris Harris角点检测的思想是通过图像的局部的小窗口观察图像角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化如下图所示 将上述思想转换为数学形式即将局部窗口向各个方向移动 ( u , v ) (u,v) (u,v)并计算所有灰度差异的总和表达式如下 E ( u , v ) ∑ x , y w ( x , y ) [ I ( x u , y v ) − I ( x , y ) ] 2 E(u,v)\sum_{x,y}w(x,y)[I(xu,yv)-I(x,y)]^{2} E(u,v)x,y∑w(x,y)[I(xu,yv)−I(x,y)]2
其中 I ( x , y ) I(x,y) I(x,y)是局部窗口的图像灰度 I ( x u , y v ) I(xu,yv) I(xu,yv)是平移后的图像灰度 w ( x , y ) w(x,y) w(x,y)是窗口函数该可以是矩形窗口也可以是对每一个像素赋予不同权重的高斯窗口如下所示 角点检测中使 E ( u , v ) E(u,v) E(u,v)的值最大。利用一阶泰勒展开有 I ( x u , y v ) I ( x , y ) I x u I u v I(xu,yv)I(x,y)I_{x}uI_{u}v I(xu,yv)I(x,y)IxuIuv
其中 I x I_{x} Ix和 I y I_{y} Iy是沿x和y方向的导数可用sobel算子计算。
推导如下 M M M矩阵决定了 E ( u , v ) E(u,v) E(u,v)的取值下面我们利用 M M M来求角点 M M M是 I x I_{x} Ix和 I y I_{y} Iy 的二次项函数可以表示成椭圆的形状椭圆的长短半轴由 M M M的特征值 λ 1 λ_{1} λ1和 λ 2 λ_{2} λ2决定方向由特征矢量决定如下图所示
椭圆函数特征值与图像中的角点、直线边缘和平面之间的关系如下图所示。 共可分为三种情况
图像中的直线。一个特征值大另一个特征值小 λ 1 λ 2 λ_{1}λ_{2} λ1λ2或 λ 2 λ 1 λ_{2}λ_{1} λ2λ1。椭圆函数值在某一方向上大在其他方向上小。图像中的平面。两个特征值都小且近似相等椭圆函数数值在各个方向上都小。图像中的角点。两个特征值都大且近似相等椭圆函数在所有方向都增大 H a r r i s Harris Harris给出的角点计算方法并不需要计算具体的特征值而是计算一个角点响应值 R R R来判断角点。 R R R的计算公式为 R d e t M − α ( t r a c e M ) 2 R detM-\alpha (traceM)^{2} RdetM−α(traceM)2
式中 d e t M detM detM为矩阵 M M M的行列式 t r a c e M traceM traceM为矩阵 M M M的迹 α α α为常数取值范围为 0.04 0.06 0.04~0.06 0.04 0.06。事实上特征是隐含在 d e t M detM detM和 t r a c e M traceM traceM中因为: d e t M λ 1 λ 2 detMλ_{1}λ_{2} detMλ1λ2 t r a c e M λ 1 λ 2 traceMλ_{1}λ_{2} traceMλ1λ2
那我们怎么判断角点呢如下图所示 当 R R R为大数值的正数时是角点当 R R R为大数值的负数时是边界当 R R R为小数是认为是平坦区域
1.2 实现
在OpenCV中实现Hariis检测使用的API是
dstcv.cornerHarris(src, blockSize, ksize, k)参数 img数据类型为 float32 的输入图像。 blockSize角点检测中要考虑的邻域大小。 ksizesobel求导使用的核大小 k 角点检测方程中的自由参数取值参数为 [0.040.06].
示例
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# 1 读取图像并转换成灰度图像
img cv.imread(./image/chessboard.jpg)
gray cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 2 角点检测
# 2.1 输入图像必须是 float32
gray np.float32(gray)# 2.2 最后一个参数在 0.04 到 0.05 之间
dst cv.cornerHarris(gray,2,3,0.04)
# 3 设置阈值将角点绘制出来阈值根据图像进行选择
img[dst0.001*dst.max()] [0,0,255]
# 4 图像显示
plt.figure(figsize(10,8),dpi100)
plt.imshow(img[:,:,::-1]),plt.title(Harris角点检测)
plt.xticks([]), plt.yticks([])
plt.show()结果如下 Harris角点检测的优缺点
优点
旋转不变性椭圆转过一定角度但是其形状保持不变特征值保持不变对于图像灰度的仿射变化具有部分的不变性由于仅仅使用了图像的一介导数对于图像灰度平移变化不变对于图像灰度尺度变化不变
缺点
对尺度很敏感不具备几何尺度不变性。提取的角点是像素级的
2 Shi-Tomasi角点检测
2.1 原理 S h i − T o m a s i Shi-Tomasi Shi−Tomasi算法是对 H a r r i s Harris Harris角点检测算法的改进一般会比 H a r r i s Harris Harris算法得到更好的角点。 H a r r i s Harris Harris 算法的角点响应函数是将矩阵 M M M 的行列式值与 M M M 的迹相减利用差值判断是否为角点。后来 S h i Shi Shi 和 T o m a s i Tomasi Tomasi 提出改进的方法是若矩阵 M M M的两个特征值中较小的一个大于阈值则认为他是角点即 R m i n ( λ 1 , λ 2 ) Rmin(λ_{1} ,λ_{2}) Rmin(λ1,λ2)
如下图所示 从这幅图中可以看出来只有当 λ 1 λ_{1} λ1 和 λ 2 λ_{2} λ2 都大于最小值时才被认为是角点。
2.2 实现
在OpenCV中实现Shi-Tomasi角点检测使用API:
corners cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance )参数
Image: 输入灰度图像maxCorners : 获取角点数的数目。qualityLevel该参数指出最低可接受的角点质量水平在0-1之间。minDistance角点之间最小的欧式距离避免得到相邻特征点。
返回
Corners: 搜索到的角点在这里所有低于质量水平的角点被排除掉然后把合格的角点按质量排序然后将质量较好的角点附近小于最小欧式距离的角点删掉最后找到 m a x C o r n e r s maxCorners maxCorners个角点返回。 示例
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 读取图像
img cv.imread(./image/tv.jpg)
gray cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 2 角点检测
corners cv.goodFeaturesToTrack(gray,1000,0.01,10)
# 3 绘制角点
for i in corners:x,y i.ravel()cv.circle(img,(x,y),2,(0,0,255),-1)
# 4 图像展示
plt.figure(figsize(10,8),dpi100)
plt.imshow(img[:,:,::-1]),plt.title(shi-tomasi角点检测)
plt.xticks([]), plt.yticks([])
plt.show()结果如下 总结 Harris算法 思想通过图像的局部的小窗口观察图像角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化。 API: cv.cornerHarris() Shi-Tomasi算法 对Harris算法的改进能够更好地检测角点 API: cv2.goodFeatureToTrack()