移动端网站如何优化,网络维护合同模板,网络建站平台,google推广怎么做一、边缘检测算子 边缘检测算子是用于检测图像中物体边界的工具。边缘通常表示图像中灰度值或颜色发生显著变化的地方。边缘检测有助于识别图像中的物体形状、轮廓和结构。这些算子通过分析图像的灰度或颜色梯度来确定图像中的边缘。 梯度算子 要得到一幅图像的梯度#xff0c…一、边缘检测算子 边缘检测算子是用于检测图像中物体边界的工具。边缘通常表示图像中灰度值或颜色发生显著变化的地方。边缘检测有助于识别图像中的物体形状、轮廓和结构。这些算子通过分析图像的灰度或颜色梯度来确定图像中的边缘。 梯度算子 要得到一幅图像的梯度则要求在图像的每个像素点位置处计算偏导数。 一阶微分算子能够检测图像中的亮度变化因此在边缘位置通常有较大的梯度值。通过检测梯度的变化可以找到图像中的边缘。 对应的卷积模板 1、Roberts 算子 原理 基于交叉差分的梯度算法通过局部差分计算检测边缘线 通过局部差分计算检测边缘线条。常用来处理具有陡峭的低噪声图像当图像边缘接近于正45度或负45度时该算法处理效果更理想。其缺点是对边缘的定位不太准确提取的边缘线条较粗。 import cv2
import numpy as np
import matplotlib.pyplot as pltimage cv2.imread(../images/1.png, cv2.IMREAD_GRAYSCALE)
# 1.定义 Roberts 算子的卷积核
roberts_x np.array([[1, 0], [0, -1]], dtypenp.float32)
roberts_y np.array([[0, 1], [-1, 0]], dtypenp.float32)
# 2.二维卷积操作
# 使用 filter2D 函数应用 Roberts 算子卷积核
gradient_x cv2.filter2D(image, cv2.CV_64F, roberts_x)
gradient_y cv2.filter2D(image, cv2.CV_64F, roberts_y)# 3.计算梯度幅值
gradient_magnitude np.sqrt(gradient_x**2 gradient_y**2)# 转换结果为8位图像
gradient_magnitude np.uint8(gradient_magnitude)# 显示原图、Roberts算子的结果和应用结果
plt.subplot(1, 4, 1)
plt.imshow(image, cmapgray)
plt.title(Original Image)
plt.axis(off)plt.subplot(1, 4, 2)
plt.imshow(gradient_x, cmapgray)
plt.title(Roberts X)
plt.axis(off)plt.subplot(1, 4, 3)
plt.imshow(gradient_y, cmapgray)
plt.title(Roberts Y)
plt.axis(off)plt.subplot(1, 4, 4)
plt.imshow(gradient_magnitude, cmapgray)
plt.title(Magnitude)
plt.axis(off)plt.show() 2、Prewitt 算子 Prewitt算子使用中心差分法计算梯度 相比Roberts 2×2 模板考虑更多的相邻像素更好地捕捉到图像中的局部变化 import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
img cv2.imread(../images/1.png, cv2.IMREAD_GRAYSCALE)# 1.使用Prewitt算子
kernelx np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]], dtypeint)
kernely np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtypeint)
# 2.卷积
gradient_x cv2.filter2D(img, cv2.CV_64F, kernelx)
gradient_y cv2.filter2D(img, cv2.CV_64F, kernely)
# 3
# 计算梯度幅值
gradient_magnitude np.sqrt(gradient_x**2 gradient_y**2)# 转换结果为8位图像
gradient_magnitude np.uint8(gradient_magnitude)# 显示原图、水平梯度、垂直梯度、Prewitt算子的结果
plt.subplot(141), plt.imshow(img, cmapgray), plt.title(Original Image), plt.axis(off)
plt.subplot(142), plt.imshow(gradient_x, cmapgray), plt.title(X), plt.axis(off)
plt.subplot(143), plt.imshow(gradient_y, cmapgray), plt.title(Y), plt.axis(off)
plt.subplot(144), plt.imshow(gradient_magnitude, cmapgray), plt.title(Prewitt Operator), plt.axis(off)
plt.show() 3、Laplace 拉普拉斯算子 Laplacian算子是基于二阶导数的边缘检测算子。二阶微分算子主要用于检测图像中的灰度变化的变化率或者说是梯度的变化率。在边缘处梯度的变化率最大因此二阶微分算子会在边缘位置产生较大的响应。 import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
img cv2.imread(../images/1.png, cv2.IMREAD_GRAYSCALE)# 使用拉普拉斯算子
laplacian cv2.Laplacian(img, cv2.CV_64F)# 转换结果为8位图像
laplacian np.uint8(np.absolute(laplacian))# 显示原图和拉普拉斯算子的结果
plt.subplot(121), plt.imshow(img, cmapgray), plt.title(Original Image), plt.axis(off)
plt.subplot(122), plt.imshow(laplacian, cmapgray), plt.title(Laplacian Operator), plt.axis(off)
plt.show()4、Canny算子 Canny基本步骤 1.去噪应用高斯滤波来平滑图像 2.找图像的梯度先将卷积模板分别作用x和y方向再计算梯度幅值和方向 3.非极大值抑制保留梯度方向上的局部极大值细化边缘 4.确定边缘。使用双阈值算法确定最终的边缘信息 import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
image cv2.imread(../images/1.png, cv2.IMREAD_GRAYSCALE)
# 高斯滤波降噪
gaussian cv2.GaussianBlur(image, (5, 5), 0)
# 使用Canny算子进行边缘检测
edges cv2.Canny(gaussian, 50, 150) # 50和150是Canny算子的两个阈值可调整# 显示原始图像和边缘检测结果
plt.subplot(121), plt.imshow(image, cmapgray)
plt.title(Original Image), plt.xticks([]), plt.yticks([])plt.subplot(122), plt.imshow(edges, cmapgray)
plt.title(Edge Image), plt.xticks([]), plt.yticks([])plt.show() 5、四种算子的比较 二、角点检测 在角上 不管你把它朝哪个方向移动像素值都会发生很大变化。 1.Moravec 注:权重函数当像素位置 (x,y) 位于滑动窗口内时权重函数为1否则为0。 E(u,v)越大 越可能是角点 2.harris 在Moravec 基础上 泰勒展开 角点响应函数R 3.Shi-Tomasi Shi-Tomasi 角点检测改进了Harris角点检测算法的R响应函数R响应函数更加简单高效。