『Python』Harris角点检测代码实现
2018-04-12 11:03
519 查看
计算机视觉课后作业,因为已经提交了一段时间了,之前也注意到网上很少有python版本的harris角点检测代码,所以开源出来,
实际上在计算Ixx,Ixy,Iyy时要进行高斯滤波,理论推导中都采用了最简单的权重(全部为1),这点注意,使用全1权重啥也检测不出来。
不进行非极大值抑制结果:
进行非极大值抑制结果(实际上检测出来的点很多,因为分辨率看不清):
# Author : hellcat # Time : 18-3-22 """ import os os.environ["CUDA_VISIBLE_DEVICES"]="-1" import numpy as np np.set_printoptions(threshold=np.inf) import tensorflow as tf config = tf.ConfigProto() config.gpu_options.allow_growth = True sess = tf.Session(config=config) """ import numpy as np from PIL import Image from skimage import filters from datetime import datetime import matplotlib.pyplot as plt IMAGE_PATH = '1653033843.jpg' # 图片路径 WITH_NMS = False # 是否非极大值抑制,True/False k = 0.04 # 响应函数参数k threshold = 0.01 # 界定阈值 img = Image.open(IMAGE_PATH) img_gray = img.convert('L') img_num = np.pad(np.asarray(img_gray, dtype=np.float32), ((1, 1), (1, 1)), 'constant') h, w = img_num.shape # padding之后的图像尺寸 # 计算Ix,Iy grad = np.empty([h, w, 2], dtype=np.float) grad[:, 1:-1, 0] = img_num[:, 2:] - img_num[:, :-2] # Ix grad[1:-1, :, 1] = img_num[2:, :] - img_num[:-2, :] # Iy # 计算Ixx,Iyy,Ixy m = np.empty([h, w, 3], dtype=np.float) # m[:, :, 0] = grad[:, :, 0]**2 # m[:, :, 1] = grad[:, :, 0]**2 # m[:, :, 2] = grad[:, :, 0]*grad[:, :, 1] m[:, :, 0] = filters.gaussian(grad[:, :, 0]**2, sigma=2) # Ixx m[:, :, 1] = filters.gaussian(grad[:, :, 1]**2, sigma=2) # Iyy m[:, :, 2] = filters.gaussian(grad[:, :, 0]*grad[:, :, 1], sigma=2) # Ixy m = [np.array([[m[i, j, 0], m[i, j, 2]], [m[i, j, 2], m[i, j, 1]]]) for i in range(h) for j in range(w)] # 记录一下R计算时耗 start = datetime.now() # 0:00:42.123384 迭代器策略:用时间换空间 # R = np.array([d-k*t**2 for d, t in zip(map(np.linalg.det, m), map(np.trace, m))]) # 0:00:35.846864 D, T = list(map(np.linalg.det, m)), list(map(np.trace, m)) R = np.array([d-k*t**2 for d, t in zip(D, T)]) end = datetime.now() print(end-start) R_max = np.max(R) R = R.reshape(h, w) # 标注角点 record = np.zeros_like(R, dtype=np.int) img_row = np.pad(np.asarray(img, dtype=np.float32), ((1, 1), (1, 1), (0, 0)), 'constant') for i in range(1, h-2): for j in range(1, w-2): if WITH_NMS: if R[i, j] > R_max*threshold and R[i, j] == np.max(R[i-1:i+2, j-1:j+2]): record[i, j] = 255 img_row[i, j] = [255, 255, 255] else: if R[i, j] > R_max*0.01: record[i, j] = 255 img_row[i, j] = [255, 255, 255] # record[R > 0.01*R_max] = 255 # img_row[R > 0.01*R_max] = [255, 255, 255] # 图像展示与保存 res = Image.fromarray(np.uint8(record[1:-1, 1:-1])) img_row = Image.fromarray(np.uint8(img_row[1:-1, 1:-1])) plt.figure() plt.subplot(1, 2, 1) plt.imshow(res) plt.subplot(1, 2, 2) plt.imshow(img_row) if WITH_NMS: plt.savefig('角点检测_NMS.jpg') res.save('角点检测_NMS_1.png') img_row.save('角点检测_NMS_2.png') else: plt.savefig('角点检测_no_NMS.jpg') res.save('角点检测_no_NMS_1.png') img_row.save('角点检测_no_NMS_2.png')
实际上在计算Ixx,Ixy,Iyy时要进行高斯滤波,理论推导中都采用了最简单的权重(全部为1),这点注意,使用全1权重啥也检测不出来。
不进行非极大值抑制结果:
进行非极大值抑制结果(实际上检测出来的点很多,因为分辨率看不清):
相关文章推荐
- Python图像特征检测算法(1):Python实现SIFT和Harris
- python用10行代码实现对黄色图片的检测功能
- 25行 Python 代码实现人脸检测——OpenCV 技术教程
- 50行Python代码实现人脸检测
- 50行Python代码实现人脸检测功能
- python用10行代码实现黄色图片检测
- 详解Harris角点检测及代码实现
- 使用VC内嵌Python实现的一个代码检测工具
- Harris角点检测原理与opencv(python)实现
- 使用VC内嵌Python实现的一个代码检测工具
- 运动检测ViBe算法python实现代码
- moravec、harris、Shi-Tomasi角点检测的简介及OpenCV代码实现
- 代码C++, opencv实现人脸识别,人脸检测,人脸匹配,视频中的人脸检测,摄像头下的人脸检测等
- [简单题]换一个思维,代码简洁度就完全变了(Python实现)
- Python实现判断一行代码是否为注释的方法
- python 剪切移动文件的实现代码
- 目标检测——CodeBook背景建模(原理+Opencv实现代码)
- 牛顿插值法(伪代码 c/c++ python实现)
- 输入密码检测大写是否锁定js实现代码