最近在上數(shù)字圖像處理課程,需要使用Python手動編寫Harris角點檢測算法,但是網(wǎng)上幾乎沒有找到手動編寫的,只能手敲。
同時作為自己的第一篇博客,在這里記錄一下。
一、Harris角點檢測
原理(略)
可以參考博主 拾牙慧者 的博客
角點檢測(Harris角點檢測法)_拾牙慧者的博客-CSDN博客_harris角點檢測
二、Python中的Harris角點檢測函數(shù)
Opencv庫自帶函數(shù):cornerHarris()函數(shù)
void cornerHarris( InputArray src, OutputArray dst, int block Size, int ksize, double k, int borderType = BORDER_DEFAULT)
參數(shù)如下
1.InputArray類型的src,輸入圖像,即原圖像,填Mat類型即可,且需要為單通道8位或者浮點型圖像;
2.OutputArray類型的dst,函數(shù)調(diào)用后的運算結(jié)果存在這里,即這個參數(shù)用于存放Harris角點檢測的輸出結(jié)果,和原圖片有一樣的尺寸和類型;
3.int類型的blockSize,表示鄰域的大小,更多詳細(xì)信息在cornerEigenValsAndVecs()中講到;
4.int類型的ksize,表示Sobel()算子的孔徑的大小;
5.double類型的k,Harris參數(shù);
6.int類型的borderType,圖像像素的邊界模式。注意它有默認(rèn)值BORDER_DEFAULT;
使用方法
import cv2
import numpy as np
img = cv2.imread('exp3/NEU_library.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = gray.astype(np.float32)
dst = cv2.cornerHarris(gray,5,3,0.04)
img[dst>0.01*dst.max()] = [0,0,255]
cv2.imshow('',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
結(jié)果如下(東北大學(xué)寧恩承圖書館)
三、手動寫Python代碼實現(xiàn)Harris焦點檢測算法
import cv2
import numpy as np
def My_corner_Harris(image, blockSize, ksize, k):
#將圖片轉(zhuǎn)化為灰度圖像,并轉(zhuǎn)化類型為float32
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
src = gray_img.astype(np.float32)
#獲取圖像長和高
SrcHeight = src.shape[0]
SrcWidth = src.shape[1]
#利用Sobel函數(shù)計算圖像梯度
#src為原圖像,-1表示輸出圖像大小與原圖像相同
#ksize為sobel算子,定義為角點檢測敏感度,必須為3-31之間的奇數(shù)
#(1,0)表示對x求偏導(dǎo),(0,1)表示對y求偏導(dǎo)
Ix=cv2.Sobel(src,-1,1,0,ksize)
Iy=cv2.Sobel(src,-1,0,1,ksize)
#計算Ix2, Ixy, Iy2
Ix2=np.multiply(Ix,Ix)
Ixy=np.multiply(Ix,Iy)
Iy2=np.multiply(Iy,Iy)
#使用高斯平滑濾波進(jìn)行加權(quán)計算
Ix2=cv2.GaussianBlur(Ix2,(blockSize,blockSize),1.3)
Ixy=cv2.GaussianBlur(Ixy,(blockSize,blockSize),1.3)
Iy2=cv2.GaussianBlur(Iy2,(blockSize,blockSize),1.3)
#計算最后的R值
R=np.zeros((SrcHeight,SrcWidth))#定義空的R矩陣
for i in range(SrcHeight):
for j in range(SrcWidth):
M=np.array([[Ix2[i,j],Ixy[i,j]],[Ixy[i,j],Iy2[i,j]]])
R[i,j]= np.linalg.det(M) - k * ((M.trace())**2)
return R
# detector parameters
block_size = 5
sobel_size = 3
k = 0.04
image = cv2.imread('exp3/NEU_library.jpg')
R = My_corner_Harris(image, block_size, sobel_size, k)
image[R>0.01*R.max()] = [0,0,255]
cv2.imshow('detection result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
測試一下結(jié)果
?和官方的cornerHarris()函數(shù)對比一下
? ?
? ? ? ? ? ? ? ? ? ? ? cornerHarris()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?My_corner_Harris
四、總結(jié)
1.簡單手動實現(xiàn)Harris角點檢測算法,未進(jìn)行改進(jìn)
2.可以考慮非極大值進(jìn)行抑制,參考Harris角點算法 - bldong - 博客園 (cnblogs.com)
3.后續(xù)會考慮實現(xiàn)Shi-Tomasi、亞像素檢測等方法,做出來的話會更新。
此致
? ? ? ? 感謝閱讀
WSZYM?文章來源:http://www.zghlxwxcb.cn/news/detail-412745.html
2022.12.01文章來源地址http://www.zghlxwxcb.cn/news/detail-412745.html
到了這里,關(guān)于基于Python手動實現(xiàn)Harris角點檢測的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!