Image Gradients

จาก Morange Wiki

วัตถุประสงค์


ทฤษฎี
OpenCV มีสามประเภท ของ gradient filters หรือ High-pass filters, Sobel, Scharr, และ Laplacian เราจะเห็นแต่ละฟังก์ชัน

Sobel and Scharr Derivatives
ด้านล่างนี้แสดงให้เห็นรหัสดำเนินการทั้งหมดในแผนภาพเดียว เคอร์เนลทั้งหมดขนาด 5x5 ความลึกของภาพ -1 เพื่อให้ได้ผลในประเภท np.uint8

import cv2
 import numpy as np
 from matplotlib import pyplot as plt
 
 img = cv2.imread('joy.jpg',0)
 
 laplacian = cv2.Laplacian(img,cv2.CV_64F)
 sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
 sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
 
 plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
 plt.title('Original'), plt.xticks([]), plt.yticks([])
 plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')
 plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
 plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray')
 plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
 plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray')
 plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
 
 plt.show()
มีข้อผิดพลาดในการสร้างรูปย่อ: ไฟล์สูญหาย

หนึ่งเรื่องสำคัญ!
ในตัวอย่างล่าสุดของเราประเภทข้อมูลการส่งออกเป็น cv2.CV_8U หรือ np.uint8 แต่มีปัญหาเล็กน้อยกับที่ สีดำต่อการเปลี่ยนแปลงสีขาวจะมาเป็น slope เชิงบวก (มีค่าบวก) ในขณะที่สีขาวไปดำเปลี่ยนแปลงเป็น slope เชิงลบ (มันจะมีค่าลบ) ดังนั้นเมื่อคุณแปลงข้อมูลไปยัง np.uint8 ทั้งหมด slope จะทำศูนย์

หากคุณต้องการที่จะตรวจสอบขอบทั้งสองตัวเลือกที่ดีคือการให้ประเภทข้อมูลออกไปบางรูปแบบที่สูงขึ้นเช่น cv2.CV_16S, cv2.CV_64F ฯลฯ ใช้ค่าสัมบูรณ์และแล้วแปลงกลับไป

cv2.CV_8U ด้านล่างเป็น Code แสดงให้เห็นถึงขั้นตอนนี้สำหรับ Sobel filter and difference

 import cv2
 import numpy as np
 from matplotlib import pyplot as plt
 
 img = cv2.imread('box.png',0)
 
 # Output dtype = cv2.CV_8U
 sobelx8u = cv2.Sobel(img,cv2.CV_8U,1,0,ksize=5)
 
 #Output dtype = cv2.CV_64F จากนั้นให้นำที่สัมบูรณ์และแปลง cv2.CV_8U
 sobelx64f = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
 abs_sobel64f = np.absolute(sobelx64f)
 sobel_8u = np.uint8(abs_sobel64f)
 
 plt.subplot(1,3,1),plt.imshow(img,cmap = 'gray')
 plt.title('Original'), plt.xticks([]), plt.yticks([])
 plt.subplot(1,3,2),plt.imshow(sobelx8u,cmap = 'gray')
 plt.title('Sobel CV_8U'), plt.xticks([]), plt.yticks([])
 plt.subplot(1,3,3),plt.imshow(sobel_8u,cmap = 'gray')
 plt.title('Sobel abs(CV_64F)'), plt.xticks([]), plt.yticks([])
 
 plt.show()
มีข้อผิดพลาดในการสร้างรูปย่อ: ไฟล์สูญหาย