Цель
В этой главе мы узнаем:
- Найдите градиенты изображения, края и т. д.
- Мы увидим следующие функции:cv.Sobel(),cv.Scharr(),cv.Laplacian()Ждать
теория
OpenCV предоставляет три типа градиентных фильтров или фильтров верхних частот, а именно Собеля, Шарра и Лапласа. Мы увидим каждого из них.
1. Операторы Собеля и Шарра
Оператор Собеля представляет собой совместную операцию сглаживания по Гауссу и дифференциальных операций, поэтому он более устойчив к шуму. Инверсия может указать направление производной, вертикальное или горизонтальное (через параметры yorder и xorder соответственно). Обратное также может указывать размер ядра через параметр ksize. еслиksize = -1
, используется фильтр Шарра 3x3, который дает лучшие результаты, чем фильтр Собеля 3x3. См. документацию по используемому ядру.
2. Оператор Лапласа
Он вычисляет Лапласа изображения, заданного соотношением $Delta src = frac{partial ^2{src}}{partial x^2} + frac{partial ^2{src}}{partial y^2}$ вычисляется оператором Собеля для производной каждого порядка. еслиksize = 1
, а затем использовать для фильтрации следующее ядро:
?kernel = begin{bmatrix} 0 & 1 & 0 \ 1 & -4 & 1 \ 0 & 1 & 0 end{bmatrix}?
код
Код ниже показывает все операторы на одном графике. Все ядра5x5
размер. Глубина выходного изображения передается через-1
получить результатnp.uint8
тип.
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('dave.jpg',0)
laplacian = cv.Laplacian(img,cv.CV_64F)
sobelx = cv.Sobel(img,cv.CV_64F,1,0,ksize=5)
sobely = cv.Sobel(img,cv.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()
результат:
важное дело
В нашем последнем примере тип выходных данныхcv.CV_8U
илиnp.uint8
. Но есть небольшая проблема. Переходы от черного к белому считаются положительными наклонами (с положительными значениями), а переходы от белого к черному считаются отрицательными наклонами (с отрицательными значениями). Поэтому, когда вы конвертируете свои данные в np.uint8, все отрицательные наклоны обнуляются. Короче говоря, вы пропустите это второстепенное сообщение.
Если вы хотите обнаружить два ребра, лучше сохранить тип выходных данных в более высокой форме, например.cv.CV_16S
,cv.CV_64F
и т. д., возьмите его абсолютное значение, а затем преобразуйте обратно вcv.CV_8U
. Код ниже демонстрирует этот процесс для горизонтального фильтра Собеля и различия в результатах.
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('box.png',0)
# Output dtype = cv.CV_8U
sobelx8u = cv.Sobel(img,cv.CV_8U,1,0,ksize=5)
# Output dtype = cv.CV_64F. Then take its absolute and convert to cv.CV_8U
sobelx64f = cv.Sobel(img,cv.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()
Проверьте результаты ниже:
Сводная станция блога о технологиях искусственного интеллекта Panchuang: http://docs.panchuang.net/PyTorch, официальная учебная станция на китайском языке: http://pytorch.panchuang.net/OpenCV, официальный китайский документ: http://woshicver.com/