OpenCV (21) --- фильтр Шарра и Лапласа

OpenCV
OpenCV (21) --- фильтр Шарра и Лапласа

фильтр Шарра

OpenCV также дает нам фильтр Шарра, который имеет ту же скорость обработки, что и фильтр Собеля, но с более высокой точностью. Его можно рассматривать как улучшенную версию фильтра Собеля, ядро ​​которого обычно:

1В OpenCV он предоставляет функцию cv2.Scharr() для вычисления фильтра Шарра, его полное определение выглядит следующим образом:

def Scharr(src, ddepth, dx, dy, dst=None, scale=None, delta=None, borderType=None):

Параметры точно такие же, как и у фильтра Собеля, если вы не поняли, то можете прочитать предыдущую статью, здесь я не буду вдаваться в подробности. Точно так же вычисленный градиент (производная) точно такой же, как у фильтра Собеля, с направлением X, направлением Y и суперпозицией XY. (Следует отметить, что фильтр Шарра не имеет направлений XY, а только наложенные. Если dx и dy установлены равными 1, будет сообщено об ошибке)

Здесь мы также реализуем эти три эффекта и сравниваем их, сначала в направлении X:

import cv2

img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED)
sobel_x=cv2.Scharr(img,cv2.CV_64F,1,0)
result=cv2.convertScaleAbs(sobel_x)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

После запуска эффект следующий:2Затем в направлении Y:

import cv2

img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED)
sobel_y=cv2.Scharr(img,cv2.CV_64F,0,1)
result=cv2.convertScaleAbs(sobel_y)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

После запуска эффект следующий:

3Наконец, это XY наложено:

import cv2

img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED)
sobel_x=cv2.Scharr(img,cv2.CV_64F,1,0)
sobel_y=cv2.Scharr(img,cv2.CV_64F,0,1)
abs_x=cv2.convertScaleAbs(sobel_x)
abs_y=cv2.convertScaleAbs(sobel_y)
result=cv2.addWeighted(abs_x,0.5,abs_y,0.5,0)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

После запуска эффект следующий:4

Разница между фильтром Шарра и фильтром Собеля заключается в том, что фильтр Собеля имеет низкую точность и небольшую структуру ядра, в то время как фильтр Шарра имеет более высокую точность, что можно найти в сравнении ниже.

5

Лапласианский фильтр

Фильтр Лапласа представляет собой производный оператор второго порядка, который обладает инвариантностью к вращению и может удовлетворять требованиям повышения резкости краев изображения в разных направлениях. Обычно сумма коэффициентов его операторов должна быть равна нулю. Например, операторная матрица ниже является оператором Лапласа, а сумма также равна 0.

6

Конкретный принцип заключается в следующем, предполагая, что наше изображение по-прежнему состоит из 9 пикселей p1-p9. Матрица оператора Лапласа и изображение будут такими, как показано ниже:

7

Даже если приблизительное значение производной точки P5 пикселя будет следующим:

P5lap=(P2+P4+P6+P8)-4*P5

В OpenCV он предоставляет нам функцию cv2.Laplacian() для реализации фильтра Лапласа, который полностью определяется следующим образом:

def Laplacian(src, ddepth, dst=None, ksize=None, scale=None, delta=None, borderType=None):

Эти параметры в основном такие же, как и предыдущие параметры, и не будут здесь повторяться. Однако следует отметить, что kszie используется для вычисления размера ядра производной, и это значение должно быть положительным нечетным числом. Когда kszie равно 1, это матрица (1, -4) выше.

Далее мы используем фильтр Лапласа для проверки эффекта, код выглядит следующим образом:

import cv2

img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED)
laplacian=cv2.Laplacian(img,cv2.CV_64F,ksize=1)
result=cv2.convertScaleAbs(laplacian)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

После запуска эффект следующий:8

Таким образом, фильтры Собеля и Шарра вычисляют значение приближенной производной первого порядка, а фильтр Лапласа вычисляет значение приближенной производной второго порядка.