• python实现Harris角点检测算法


    算法流程:

    1. 将图像转换为灰度图像
    2. 利用Sobel滤波器求出 海森矩阵 (Hessian matrix) :
      海森矩阵
      Ix和Iy的计算方式
    3. 将高斯滤波器分别作用于Ix²、Iy²、IxIy
    4. 计算每个像素的 R= det(H) - k(trace(H))²。det(H)表示矩阵H的行列式,trace表示矩阵H的迹。通常k的取值范围为[0.04,0.16]。
    5. 满足 R>=max(R) * th 的像素点即为角点。th常取0.1。

    Harris算法实现:

    import cv2 as cv 
    import numpy as np
    import matplotlib.pyplot as plt
    
    
    # Harris corner detection
    def Harris_corner(img):
    
    	## Grayscale
    	def BGR2GRAY(img):
    		gray = 0.2126 * img[..., 2] + 0.7152 * img[..., 1] + 0.0722 * img[..., 0]
    		gray = gray.astype(np.uint8)
    		return gray
    
    	## Sobel
    	def Sobel_filtering(gray):
    		# get shape
    		H, W = gray.shape
    
    		# sobel kernel
    		sobely = np.array(((1, 2, 1),
    						(0, 0, 0),
    						(-1, -2, -1)), dtype=np.float32)
    
    		sobelx = np.array(((1, 0, -1),
    						(2, 0, -2),
    						(1, 0, -1)), dtype=np.float32)
    
    		# padding
    		tmp = np.pad(gray, (1, 1), 'edge')
    
    		# prepare
    		Ix = np.zeros_like(gray, dtype=np.float32)
    		Iy = np.zeros_like(gray, dtype=np.float32)
    
    		# get differential
    		for y in range(H):
    			for x in range(W):
    				Ix[y, x] = np.mean(tmp[y : y  + 3, x : x + 3] * sobelx)
    				Iy[y, x] = np.mean(tmp[y : y + 3, x : x + 3] * sobely)
    			
    		Ix2 = Ix ** 2
    		Iy2 = Iy ** 2
    		Ixy = Ix * Iy
    
    		return Ix2, Iy2, Ixy
    
    
    	# gaussian filtering
    	def gaussian_filtering(I, K_size=3, sigma=3):
    		# get shape
    		H, W = I.shape
    
    		## gaussian
    		I_t = np.pad(I, (K_size // 2, K_size // 2), 'edge')
    
    		# gaussian kernel
    		K = np.zeros((K_size, K_size), dtype=np.float)
    		for x in range(K_size):
    			for y in range(K_size):
    				_x = x - K_size // 2
    				_y = y - K_size // 2
    				K[y, x] = np.exp( -(_x ** 2 + _y ** 2) / (2 * (sigma ** 2)))
    		K /= (sigma * np.sqrt(2 * np.pi))
    		K /= K.sum()
    
    		# filtering
    		for y in range(H):
    			for x in range(W):
    				I[y,x] = np.sum(I_t[y : y + K_size, x : x + K_size] * K)
    				
    		return I
    
    	# corner detect
    	def corner_detect(gray, Ix2, Iy2, Ixy, k=0.04, th=0.1):
    		# prepare output image
    		out = np.array((gray, gray, gray))
    		out = np.transpose(out, (1,2,0))
    
    		# get R
    		R = (Ix2 * Iy2 - Ixy ** 2) - k * ((Ix2 + Iy2) ** 2)
    
    		# detect corner
    		out[R >= np.max(R) * th] = [255, 0, 0]
    
    		out = out.astype(np.uint8)
    
    		return out
    
    	
    	# 1. grayscale
    	gray = BGR2GRAY(img)
    
    	# 2. get difference image
    	Ix2, Iy2, Ixy = Sobel_filtering(gray)
    
    	# 3. gaussian filtering
    	Ix2 = gaussian_filtering(Ix2, K_size=3, sigma=3)
    	Iy2 = gaussian_filtering(Iy2, K_size=3, sigma=3)
    	Ixy = gaussian_filtering(Ixy, K_size=3, sigma=3)
    
    	# 4. corner detect
    	out = corner_detect(gray, Ix2, Iy2, Ixy)
    
    	return out
    
    
    # Read image
    img = cv.imread("../qiqiao.jpg").astype(np.float32)
    
    # Harris corner detection
    out = Harris_corner(img)
    
    cv.imwrite("out.jpg", out)
    cv.imshow("result", out)
    cv.waitKey(0)
    cv.destroyAllWindows()
    

    实验结果:

    原图:
    原图
    Harris角点检测算法检测结果:
    角点检测结果

    点个赞再走呗!

  • 相关阅读:
    python中函数部分简介与定义(二)
    python中函数部分简介与定义(一)
    db2 不允许在自动存储器表空间上执行 SET TABLESPACE CONTAINERS 命令。的解决办法
    JQuery中$.ajax()方法参数详解
    jquery post 同步异步总结
    js设置height随窗口大小改变
    关于POI的系统整理
    POI 实现导出excel表
    转载>>JQuery EasyUI datagrid 合并表头处理
    iframe标签用法详解(属性、透明、自适应高度)
  • 原文地址:https://www.cnblogs.com/wojianxin/p/12574909.html
Copyright © 2020-2023  润新知