-
Notifications
You must be signed in to change notification settings - Fork 0
/
sobel_train.py~
92 lines (71 loc) · 3.52 KB
/
sobel_train.py~
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import cv2
import numpy as np
import matplotlib.image as matimg
import matplotlib.pyplot as pyplot
def abs_sobel_thresh(img, kernel_size = 3,orient='x', thresh_min=0, thresh_max=255):
# Apply the following steps to img
# 1) Convert to grayscale
# 2) Take the derivative in x or y given orient = 'x' or 'y'
# 3) Take the absolute value of the derivative or gradient
# 4) Scale to 8-bit (0 - 255) then convert to type = np.uint8
# 5) Create a mask of 1's where the scaled gradient magnitude
# is > thresh_min and < thresh_max
# 6) Return this mask as your binary_output image
copied = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
if orient == 'x':
sobel_x = cv2.Sobel(copied,cv2.CV_64F,1,0,ksize=kernel_size)
elif orient == 'y':
sobel_x = cv2.Sobel(copied,cv2.CV_64F,0,1,ksize=kernel_size)
#先去绝对值,然后伸缩为0->255
abs_sobel_x = np.absolute(sobel_x)
abs_sobel_x = np.uint8(255*abs_sobel_x/np.max(abs_sobel_x))
binary_output = np.zeros_like(abs_sobel_x)
binary_output[(abs_sobel_x> thresh_min) & (abs_sobel_x < thresh_max)] = 1
return binary_output
def mag_thresh(img, sobel_kernel=3, mag_thresh=(0, 255)):
# Apply the following steps to img
# 1) Convert to grayscale
# 2) Take the gradient in x and y separately
# 3) Calculate the magnitude
# 4) Scale to 8-bit (0 - 255) and convert to type = np.uint8
# 5) Create a binary mask where mag thresholds are met
# 6) Return this mask as your binary_output image
gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
sobel_x = np.abs(cv2.Sobel(gray,cv2.CV_64F,1,0,ksize=sobel_kernel))
sobel_y = np.abs(cv2.Sobel(gray,cv2.CV_64F,0,1,ksize=sobel_kernel))
magnitude = np.sqrt(sobel_x**2 + sobel_y**2)
magnitude = np.uint8(255*magnitude/np.max(magnitude))
binary_output = np.zeros_like(magnitude)
binary_output[(magnitude > mag_thresh[0]) & (magnitude < mag_thresh[1])] = 1
return binary_output
def dir_threshold(img, sobel_kernel=3, thresh=(0, np.pi/2)):
# Apply the following steps to img
# 1) Convert to grayscale
# 2) Take the gradient in x and y separately
# 3) Take the absolute value of the x and y gradients
# 4) Use np.arctan2(abs_sobely, abs_sobelx) to calculate the direction of the gradient
# 5) Create a binary mask where direction thresholds are met
# 6) Return this mask as your binary_output image
gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
#不指定ksize,内核大小不生效
sobel_x = cv2.Sobel(gray,cv2.CV_64F,1,0,ksize=sobel_kernel)
sobel_y = cv2.Sobel(gray,cv2.CV_64F,0,1,ksize=sobel_kernel)
abs_orientataion = np.arctan2(np.absolute(sobel_y),np.absolute(sobel_x))
# abs_orientataion = np.abs(orientation)
binary_output = np.zeros_like(abs_orientataion)
binary_output[(abs_orientataion>=thresh[0]) & (abs_orientataion<=thresh[1])]=1
return binary_output
def show(img):
pyplot.imshow(img,cmap='gray')
pyplot.show()
img = matimg.imread('sobel_train.png')
# filter horizontal line
x_sobel = abs_sobel_thresh(img=img, kernel_size=5,orient='x', thresh_min=30,thresh_max=100)
y_sobel = abs_sobel_thresh(img=img, kernel_size=5,orient='y', thresh_min=30,thresh_max=100)
mag_sobel = mag_thresh(img,sobel_kernel=15,mag_thresh=(30,100))
direct_sobel = dir_threshold(img,sobel_kernel=15,thresh=(0.7,1.4))
combined = np.zeros_like(img)
combined[(mag_sobel==1) & (direct_sobel==1) | ((x_sobel == 1) &(y_sobel == 1))] = 1
# pyplot.subplot(2,2,1)
pyplot.imshow(combined)
pyplot.show()