1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
import cv2
import numpy as np
def _edge_extraction(img: np.ndarray, kernel_method='robert'):
"""
边缘提取
:param img: 需要进行边缘提取的图,COLOR:BGR
:param kernel_method: 边缘提取算子名称,全小写
:return: x方向(0.5x)和y方向(0.5y)边缘提取的加权和
"""
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 边缘提取算子
if 'robert' == kernel_method:
kernel_x = np.array([[-1, 0], [0, 1]], dtype=int)
kernel_y = np.array([[0, -1], [1, 0]], dtype=int)
elif 'prewitt' == kernel_method:
kernel_x = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int)
kernel_y = np.array([[1, 1, 1], [0, 0, 0], [1, 1, 1]], dtype=int)
elif 'sobel' == kernel_method:
kernel_x = np.array([[-1, 0, 1], [-2, 0, -2], [-1, 0, 1]], dtype=int)
kernel_y = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]], dtype=int)
elif 'laplacian' == kernel_method:
kernel_x = np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]], dtype=int)
kernel_y = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype=int)
else:
kernel_x = np.array([[-1, 0], [0, 1]], dtype=int)
kernel_y = np.array([[0, -1], [1, 0]], dtype=int)
# 进行边缘提取
filter_x = cv2.filter2D(gray, ddepth=-1, kernel=kernel_x)
filter_y = cv2.filter2D(gray, ddepth=-1, kernel=kernel_y)
# x方向和y方向加权
img_add_weight = cv2.addWeighted(filter_x, 0.5, filter_y, 0.5, 0)
return img_add_weight
def image_show(img: np.ndarray, title='img'):
"""
显示图片
:param img:
:param title:
:return:
"""
cv2.namedWindow(title)
cv2.imshow(title, img)
cv2.waitKey(0)
def edge_extraction(path: str, kernel_method='robert'):
# 读取图片
img = cv2.imdecode(np.fromfile(path, dtype=np.uint8), cv2.IMREAD_COLOR)
# 边缘提取
img_extraction = _edge_extraction(img, kernel_method=kernel_method)
# 显示图片
image_show(img_extraction, kernel_method)
|