Last active
June 13, 2017 13:27
-
-
Save hackintoshrao/db8e5438b3f41850f4a5a4131ac60acb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # Saturation color channel binary threshold. | |
| def s_threshold(img, s_thresh=(0, 255)): | |
| s_channel = cv2.cvtColor(img, cv2.COLOR_BGR2HLS)[:,:,2] | |
| # Threshold color channel | |
| s_binary = np.zeros_like(s_channel) | |
| s_binary[(s_channel >= s_thresh[0]) & (s_channel <= s_thresh[1])] = 1 | |
| return s_binary | |
| # Define a function that takes an image, gradient orientation, | |
| # and threshold min / max values. | |
| def abs_sobel_thresh(img, orient='x', sobel_kernel=3, thresh=(0, 255)): | |
| # Convert to grayscale | |
| gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
| # Apply x or y gradient with the OpenCV Sobel() function | |
| # and take the absolute value | |
| if orient == 'x': | |
| abs_sobel = np.absolute(cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize = sobel_kernel)) | |
| if orient == 'y': | |
| abs_sobel = np.absolute(cv2.Sobel(gray, cv2.CV_64F, 0, 1)) | |
| # Rescale back to 8 bit integer | |
| scaled_sobel = np.uint8(255*abs_sobel/np.max(abs_sobel)) | |
| # Create a copy and apply the threshold | |
| binary_output = np.zeros_like(scaled_sobel) | |
| # Here I'm using inclusive (>=, <=) thresholds, but exclusive is ok too | |
| binary_output[(scaled_sobel >= thresh[0]) & (scaled_sobel <= thresh[1])] = 1 | |
| # But the binary image just pitch black with no edges in it. | |
| # Return the result | |
| return binary_output | |
| # Define a function to return the magnitude of the gradient | |
| # for a given sobel kernel size and threshold values | |
| def mag_thresh(img, sobel_kernel=3, mag_thresh=(0, 255)): | |
| # Convert to grayscale | |
| gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
| # Take both Sobel x and y gradients | |
| sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=sobel_kernel) | |
| sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=sobel_kernel) | |
| # Calculate the gradient magnitude | |
| gradmag = np.sqrt(sobelx**2 + sobely**2) | |
| # Rescale to 8 bit | |
| scale_factor = np.max(gradmag)/255 | |
| gradmag = (gradmag/scale_factor).astype(np.uint8) | |
| # Create a binary image of ones where threshold is met, zeros otherwise | |
| binary_output = np.zeros_like(gradmag) | |
| binary_output[(gradmag >= mag_thresh[0]) & (gradmag <= mag_thresh[1])] = 1 | |
| # Return the binary image | |
| return binary_output | |
| # Define a function to threshold an image for a given range and Sobel kernel | |
| def dir_threshold(img, sobel_kernel=3, thresh=(0, np.pi/2)): | |
| # Grayscale | |
| gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
| # Calculate the x and y gradients | |
| sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=sobel_kernel) | |
| sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=sobel_kernel) | |
| # Take the absolute value of the gradient direction, | |
| # apply a threshold, and create a binary image result | |
| absgraddir = np.arctan2(np.absolute(sobely), np.absolute(sobelx)) | |
| binary_output = np.zeros_like(absgraddir) | |
| binary_output[(absgraddir >= thresh[0]) & (absgraddir <= thresh[1])] = 1 | |
| # Return the binary image | |
| return binary_output | |
| test_image = cv2.imread("./test_images/test5.jpg") | |
| # Apply each of the thresholding functions | |
| gradx = abs_sobel_thresh(test_image, orient='x', sobel_kernel=ksize, thresh=(10, 255)) | |
| grady = abs_sobel_thresh(test_image, orient='y', sobel_kernel=ksize, thresh=(60, 255)) | |
| mag_binary = mag_thresh(test_image, sobel_kernel=ksize, mag_thresh=(40, 255)) | |
| dir_binary = dir_threshold(test_image, sobel_kernel=ksize, thresh=(.65, 1.05)) | |
| saturation_binary = s_threshold(test_image, s_thresh=(160, 255)) | |
| combined = np.zeros_like(dir_binary) | |
| combined[((gradx == 1) & (grady == 1)) | ((mag_binary == 1) & (dir_binary == 1)) | (saturation_binary == 1)] = 1 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment