步骤
1.降噪
应用高斯滤波器,以平滑图像,滤除噪声。
边缘检测易受噪声影响,所以使用高斯滤波器平滑图像,降低噪声。
2.梯度
计算图像中每个像素点的梯度大小和方向。
计算大小
Sobel算子是一种常用的边缘检测滤波器,用于计算图像中水平和垂直方向上的梯度变化
就是点乘计算
计算方向
3.非极大值抑制
使用非极大值抑制,消除边缘检测带来的不利影响
4.双阈值检测
应用双阈值检测确定真实和潜在的边缘【双阈值检测
阈值 (minVal 和 maxVal) 是基于梯度大小(即边缘强度)来定义的
- maxVal(高阈值):
- 梯度值大于 maxVal 的像素点被直接认为是真正的边缘。
- minVal(低阈值):
- 梯度值小于 minVal 的像素点被忽略,认为不是边缘。
- 梯度值介于 minVal 和 maxVal 之间:
- 如果这些像素点与高于 maxVal 的边缘像素相连,则保留为边缘。
- 如果没有相连,则丢弃。
实现
它有现成库可以调用啊
import cv2
import matplotlib.pyplot as plt
import numpy as np# 读取图像
image_path = r"D:\python\NAFNet-main\demo\tooth.png" # 替换为你的图片路径
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)# 高斯模糊去噪
blurred = cv2.GaussianBlur(image, (5, 5), 0)# Canny 边缘检测
edges = cv2.Canny(blurred, threshold1=5, threshold2=200)#这边就是最大最小边缘# 显示原图和边缘检测结果
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title("Original Image")
plt.imshow(image, cmap="gray")
plt.axis("off")plt.subplot(1, 2, 2)
plt.title("Canny Edge Detection")
plt.imshow(edges, cmap="gray")
plt.axis("off")plt.tight_layout()
plt.show()
最后结果