图像特征提取是计算机视觉领域中的一个重要技术,它在各种应用中发挥着关键作用。以下是图像特征提取的一些主要应用:
常见的边缘检测方法包括Sobel算子、Laplacian算子等。这些算子都是通过计算图像灰度函数的一阶或二阶导数来检测边缘。
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图片
img = cv2.imread('cat.jpeg')
# 将图片转换为灰度图
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用Sobel算子进行边缘检测
sobel_edges = cv2.Sobel(gray_img, cv2.CV_8U, 1, 1, ksize=3)
# 使用Laplacian算子进行边缘检测
laplacian_edges = cv2.Laplacian(gray_img, cv2.CV_8U)
# 显示原始图像和处理后的图像(可选)
plt.figure(figsize=(10,10))
plt.subplot(1,3,1), plt.imshow(gray_img, cmap='gray'), plt.title('Original Image')
plt.subplot(1,3,2), plt.imshow(sobel_edges, cmap='gray'), plt.title('Edges using Sobel Operator')
plt.subplot(1,3,3), plt.imshow(laplacian_edges, cmap='gray'), plt.title('Edges using Laplacian Operator')
plt.show()
运行结果如下所示:
角点提取的方法包括Harris角点检测算法、Shi-Tomasi角点检测算法等。这些算法通过计算图像中每个像素点的灰度值变化率来判断该点是否为角点。
import cv2
import numpy as np
# 读取图片
img = cv2.imread('cat.jpeg')
# 将图片转换为灰度图
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Harris角点检测
corner_harris = cv2.cornerHarris(gray_img, 2, 3, 0.04)
# 对Harris检测的结果进行膨胀,以便更好地标记角点位置
corner_harris = cv2.dilate(corner_harris, None)
# 阈值处理,将角点和非角点分开(可调整阈值进行更细致地控制)
corner_harris[corner_harris > 0.01 * corner_harris.max()] = 255
corner_harris = np.uint8(corner_harris)
# 找到Harris角点,并标记出来
img[corner_harris > 0] = [0, 0, 255]
# 显示图像
cv2.imshow('Harris Corners', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如下图所示:
下面是Shi-Tomasi角点检测:
import cv2
import numpy as np
# 读取图片
img = cv2.imread('cat.jpeg')
# 将图片转换为灰度图
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Shi-Tomasi角点检测,这里使用cv2.goodFeaturesToTrack函数
corners = cv2.goodFeaturesToTrack(gray_img, maxCorners=100, qualityLevel=0.3, minDistance=7)
# 在原图像上绘制检测到的角点
for corner in corners:
x, y = corner.ravel()
cv2.circle(img, (x, y), 3, (0, 255, 0), -1)
# 显示图像
cv2.imshow('Shi-Tomasi Corners', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如下:
Canny算法是一种多级边缘检测算法,由John F. Canny于1986年开发。以下是Canny算法的详细介绍:
Canny算法的目标是找到一个最优的边缘检测算法,其最优边缘的定义为:好的检测(算法能够尽可能标记出图像中的实际边缘)、好的定位(标识出的边缘要与实际图像中的边缘尽可能接近)以及最小响应(图像中的边缘只能标记一次)。
Canny算法的步骤包括:
此外,Canny算法还使用非极大值抑制技术,其思想是搜索局部最大值,抑制非极大值。这一步的目的是剔除掉一大部分非边缘的点。
最后,双阈值算法被用于检测和连接边缘。
需要注意的是,Canny算法中的高斯卷积核大小的选择将影响检测器的性能。尺寸越大,检测器对噪声的敏感度越低,但是边缘检测的定位误差也将略有增加。
因此,在实际应用中需要权衡这两个因素。
import cv2
# 读取图片
img = cv2.imread('cat.jpeg')
# 将图片转换为灰度图
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用Canny算法进行边缘检测
edges = cv2.Canny(gray_img, threshold1=30, threshold2=100)
# 显示原图和处理后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Edge Image', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们首先读取图像并转换为灰度图像。
然后,我们使用cv2.Canny()函数来实现Canny边缘检测。
其中,threshold1和threshold2是两个阈值参数,可根据实际情况进行调整。
这两个阈值用于Canny算法中的滞后阈值处理,即只有像素梯度值超过threshold2的点会被认为是强边缘点,而处于threshold1和threshold2之间的点只有与强边缘点相连时才会被认为是边缘点。
最后,我们使用cv2.imshow()函数来显示原始图像和处理后的边缘图像。