Градиенты изображений OpenCV-Python |18

глубокое обучение

Цель

В этой главе мы узнаем:

  • Найдите градиенты изображения, края и т. д.
  • Мы увидим следующие функции: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()

результат:gradients

важное дело

В нашем последнем примере тип выходных данных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()

Проверьте результаты ниже:double_edge

Сводная станция блога о технологиях искусственного интеллекта Panchuang: http://docs.panchuang.net/PyTorch, официальная учебная станция на китайском языке: http://pytorch.panchuang.net/OpenCV, официальный китайский документ: http://woshicver.com/