import cv2
import numpy as np
img = cv2.imread("../01_Img/01.jpg", 1)
imgInfo = img.shape # 获取图像宽高信息
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图转换
imgG = cv2.GaussianBlur(gray, (3, 3), 0) # 高斯滤波
dst = cv2.Canny(img, 50, 50) # 后面的50是 图片通过卷积运算后 50 为边缘点
cv2.imshow("dst", dst)
cv2.waitKey(0)
步骤:
灰度图转换 ----> 使用Sobel 算子分别对图像 x, y 进行卷积运算 ----> 确定梯度值
----> 给定阈值判定边界 ----> 展示图象
sobel 算子 模板:
Y 方向:
-1 | -2 | -1 |
---|---|---|
0 | 0 | 0 |
1 | 2 | 1 |
X 方向:
-1 | 0 | 1 |
---|---|---|
-2 | 0 | 2 |
-1 | 0 | 1 |
代码演示:
1> 准备环境
import math
import cv2
import numpy as np
img = cv2.imread("../01_Img/01.jpg", 1)
imgInfo = img.shape
2> 给定阈值 并建立目标图像矩阵
yu = 50 # 此处给定阈值为 50
dst = np.zeros((imgInfo[0], imgInfo[1], 1), np.uint8) # 建立目标图像的空矩阵
3> 灰度图像转换算法
for i in range(0, imgInfo[0]):
for j in range(0, imgInfo[1]):
(b, g, r) = img[i, j]
gray = (int(b)+int(g)+int(r))/3 # 取BGR平均值
dst[i, j] = gray
4> 边缘检测算法实现
for i in range(0, imgInfo[0]-2):
for j in range(0, imgInfo[1]-2):
# 1. 使用Sobel算子 对图像进行卷积运算
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
gx = gray[i, j]*1 - gray[i, j+2]*1 + gray[i+1, j]*2 - gray[i+1, j+2]*2 + gray[i+2, j]*1 - gray[i+2, j+2]*1
# 2.梯度计算
grad = math.sqrt(math.pow(gy, 2) + math.pow(gx, 2))
# 3.阈值判定
if grad > yu:
dst[i, j] = 255
else:
dst[i, j] = 0
5> 展示图片
cv2.imshow("dst", dst)
cv2.waitKey(0)