本文解释Canny和sobel边缘检测算法。
1)Canny算法实现
步骤:
- 读取灰度图
- 高斯滤波
- Canny算法
- 显示边缘
import cv2
import numpy as np
import random
img = cv2.imread('face.jpg', 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 模板大小:(3, 3) (高斯模糊后图像质量降低)
imgG = cv2.GaussianBlur(gray, (3, 3), 0)
# 50 50 两个边缘门限
dst = cv2.Canny(img, 50, 50)
cv2.imshow('src', img)
cv2.imshow('img GaussianBlur', imgG)
cv2.imshow('dst', dst)
cv2.waitKey(0)
效果如下:

2)Sobel算法原理与实现
步骤:
- 读取灰度图
- 用Sobel算子模板卷积
- 阈值判决
- 显示边缘
import cv2
import numpy as np
import random
# 算法模块
import math
# 1 读取灰度图
img = cv2.imread('1.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 2 用算子模板进行卷积(算子: 函数到函数/值的映射)
dst = np.zeros((height, width, 1), np.uint8)
# 算子模板
# [1 2 1 [ 1 0 -1
# 0 0 0 2 0 -2
# -1 -2 -1] 1 0 -1]
for i in range(0, height - 2):
for j in range(0, width - 2):
# 图像卷积
# y方向梯度
gy = gray[i, j] * 1 + gray[i, j + 1] * 2 + gray[i, j + 2] * 1 + gray[i + 2, j] * (-1) + gray[i + 2, j + 1] * (-2) + gray[i + 2, j + 2] * (-1)
# x方向梯度
gx = gray[i, j] * 1 + gray[i, j + 1] * 0 + gray[i, j + 2] * (-1) + gray[i + 1, j] * 2 + gray[i + 1, j + 1] * 0 + gray[i + 1, j + 1] * (-2) + gray[i + 2, j] * 1 + gray[i + 2, j + 1] * 0 + gray[i + 2, j + 2] * (-1)
grad = math.sqrt(gx * gx + gy * gy)
# 3 阈值判决
if grad > 50:
dst[i, j] = 255
else:
dst[i, j] = 0
# 4 显示边缘
cv2.imshow('src', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
效果如下:

网友评论