自适应阈值Canny边缘检测处理图片并保存
时间: 2024-01-08 10:04:30 浏览: 174
好的,以下是Python代码示例:
```python
import cv2
# 读取图片
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 计算阈值
median = int(cv2.medianBlur(img, 5).mean())
lower_thresh = int(max(0, (1.0 - 0.33) * median))
upper_thresh = int(min(255, (1.0 + 0.33) * median))
# Canny边缘检测
edges = cv2.Canny(img, lower_thresh, upper_thresh)
# 保存图片
cv2.imwrite('edges.jpg', edges)
```
这段代码首先读取了一张灰度图像,然后使用中值滤波计算阈值,并将阈值应用于Canny边缘检测。接着,将处理后的边缘图像保存到文件中。你可以根据自己的需求修改代码中的参数和文件名。
相关问题
自适应阈值Canny边缘检测
自适应阈值Canny边缘检测是一种改进的Canny边缘检测算法,它可以根据图像的局部特征自动调整阈值,从而提高边缘检测的鲁棒性和精度。它的基本思路是先计算图像的局部方差,然后根据局部方差自适应地计算阈值,最后使用Canny算法进行边缘检测。这种方法可以有效地处理图像中的噪声和光照变化等问题,从而得到更加准确的边缘检测结果。
自适应阈值canny边缘检测步骤
自适应阈值Canny边缘检测算法的步骤如下:
1. 对输入图像进行高斯滤波,以平滑图像并去除噪声。
```python
import cv2
img = cv2.imread('image.jpg', 0)
blur = cv2.GaussianBlur(img, (3, 3), 0)
```
2. 计算图像中每个像素的梯度幅值和方向。
```python
sobelx = cv2.Sobel(blur, cv2.CV_64F, 1, 0, ksize=3)
sobely = cv2.Sobel(blur, cv2.CV_64F, 0, 1, ksize=3)
mag = cv2.magnitude(sobelx, sobely)
theta = cv2.phase(sobelx, sobely, angleInDegrees=True)
```
3. 对梯度方向进行四舍五入,将其转换为只有0、45、90、135度四个方向。
```python
theta = np.round(theta / 45) * 45 % 180
```
4. 对梯度幅值进行非最大抑制,以保留边缘的细节信息。
```python
rows, cols = mag.shape
for i in range(1, rows - 1):
for j in range(1, cols - 1):
if (0 <= theta[i, j] < 22.5) or (157.5 <= theta[i, j] <= 180):
if (mag[i, j] > mag[i, j - 1]) and (mag[i, j] > mag[i, j + 1]):
mag[i, j] = mag[i, j]
else:
mag[i, j] = 0
elif (22.5 <= theta[i, j] < 67.5):
if (mag[i, j] > mag[i - 1, j - 1]) and (mag[i, j] > mag[i + 1, j + 1]):
mag[i, j] = mag[i, j]
else:
mag[i, j] = 0
elif (67.5 <= theta[i, j] < 112.5):
if (mag[i, j] > mag[i - 1, j]) and (mag[i, j] > mag[i + 1, j]):
mag[i, j] = mag[i, j]
else:
mag[i, j] = 0
elif (112.5 <= theta[i, j] < 157.5):
if (mag[i, j] > mag[i - 1, j + 1]) and (mag[i, j] > mag[i + 1, j - 1]):
mag[i, j] = mag[i, j]
else:
mag[i, j] = 0
```
5. 使用自适应阈值进行双阈值处理,以确定边缘像素。
```python
mag_max = np.max(mag)
mag_min = np.min(mag)
threshold1 = mag_min + 0.2 * (mag_max - mag_min)
threshold2 = mag_min + 0.8 * (mag_max - mag_min)
rows, cols = mag.shape
for i in range(rows):
for j in range(cols):
if mag[i, j] < threshold1:
mag[i, j] = 0
elif mag[i, j] > threshold2:
mag[i, j] = 255
else:
mag[i, j] = 50
```
6. 对双阈值处理后的图像进行边缘连接,以得到完整的边缘。
```python
edges = cv2.Canny(mag, threshold1, threshold2)
```
阅读全文