1 import cv2 as cv
2 import numpy as np
3 import math
4
5 # 从源码层面实现边缘检测
6 img = cv.imread('../images/face.jpg', flags=1) # flags=1读取为彩色,flags=0读取为灰度
7 h, w = img.shape[:2]
8 gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
9 dst = np.zeros((h, w, 1), np.uint8)
10 # 1.sobel 算子模板
11 # [1 2 1 [1 0 -1
12 # 0 0 0 2 0 -2
13 # -1 -2 -1] 1 0 -1]
14 # 2.图片卷积
15 # [1 2 3 4] [a b c d] -> a*1+b*2+c*3+d*4=dst
16 # 3.阈值判决
17 # sqrt(a*a+b*b) = f > th
18
19 for i in range(h-2):
20 for j in range(w-2):
21 gy = gray[i, j] + gray[i, j+1]*2 + gray[i, j+2] - gray[i+2, j] - gray[i+2, j+1]*2 - gray[i+2, j+2]
22 gx = gray[i, j] + gray[i+1, j]*2 + gray[i+2, j] - gray[i, j+2] - gray[i+1, j+2]*2 - gray[i+2, j+2]
23 grad = math.sqrt(gx*gx+gy*gy)
24 if grad > 100: # 阈值假设为100
25 dst[i, j] = 255
26 else:
27 dst[i, j] = 0
28
29 cv.imshow('img1', img)
30 cv.imshow('img2', dst)
31 cv.waitKey(0)