图像特征
什么是图像特征?
| 特征
·对图像进行描述。
·指出图像中的相关信息。
·将一组图像与其他图像区分开来。
| 类别
·全局特征:将图像视为一个整体。
·局部特征:图像中的部分区域。
| 正式定义
在计算机视觉和图像处理中,特征指的是为解决与某一应用有关的计算任务的一段信息。
·所有的机器学习和深度学习算法都依赖于特征。
什么能作为特征?
·单独的像素点强度不能作为特征
| 特征
·总体强度测量平均值,直方图,调色板等。
·边缘和山脊梯度和轮廓。
·特殊的角点特征和曲率。
·斑点和纹理。
·使用过滤器获得的特征。
例子
1, 像素点强度
像素点强度组合作为特征
2, 边缘
边缘作为特征
3, 关键点
关键点作为特征
什么是好的特征?
那些受外部因素影响不大的特征是好的特征。
| 特征不变性
·伸缩
·旋转
·转换
·透视法
·仿射
·颜色
·照度
角点特征
·角:定义为两条边的交点。·关键点:图像中具有明确位置且可以可靠检测的点。
| 适用范围
·运动检测和视频跟踪。·图像注册。·图像拼接和全景拼接。·3D建模和对象识别。
例子
1, 关键点
关键点识别
2, 角
角识别
Harris角点检测
| Harris角点检测算法可以分为5个步骤
·转化为灰度图
·计算空间导数
·设置结构向量
·计算Harris响应
·抑制非最大值
| 使用OpenCV实现Harris角点检测
''''' Harris Corners using OpenCV ''' %matplotlib inline import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread("imgs/chapter9/chess_slant.jpg", 1) #img = cv2.resize(img, (96, 96)) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) gray = np.float32(gray) ################################FOCUS############################### dst = cv2.cornerHarris(gray,2,3,0.04) #################################################################### # Self-study: Parameters plt.figure(figsize=(8, 8)) plt.imshow(dst, cmap="gray") plt.show()
''''' result is dilated for marking the corners ''' dst = cv2.dilate(dst,None) plt.figure(figsize=(8, 8)) plt.imshow(dst, cmap="gray") plt.show()
''''' Threshold for an optimal value, it may vary depending on the image. We first calculate what is the maximum and minimum value of pixel in this image ''' max_val = np.uint8(dst).max() min_val = np.uint8(dst).min() print("max_val = {}".format(max_val)) print("min_val = {}".format(min_val))
输出
max_val = 255 min_val = 0 img = cv2.imread("imgs/chapter9/chess_slant.jpg", 1) img[dst>0.1*dst.max()]=[0,0,255] plt.figure(figsize=(8, 8)) plt.imshow(img[:,:,::-1]) plt.show()
|利用OpenCV-harris角点求角点坐标
%matplotlib inline import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread("imgs/chapter9/chess_slant.jpg", 1); #img = cv2.resize(img, (96, 96)) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # find Harris corners gray = np.float32(gray) dst = cv2.cornerHarris(gray,2,3,0.04) dst = cv2.dilate(dst,None) ret, dst = cv2.threshold(dst,0.01*dst.max(),255,0) dst = np.uint8(dst) # find centroids ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst) # define the criteria to stop and refine the corners # Explain Criteria criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001) corners = cv2.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria) # Now draw them res = np.hstack((centroids,corners)) res = np.int0(res) for x1, y1, x2, y2 in res: #cv2.circle(img,(x1, y1), 5, (0,255,0), -1) # Point Centroids cv2.circle(img,(x2, y2), 10, (0,0,255), -1) # Point corners #img[res[:,1],res[:,0]]=[0,0,255] #img[res[:,3],res[:,2]] = [0,255,0] plt.figure(figsize=(8, 8)) plt.imshow(img[:,:,::-1]) plt.show()