фильтр Шарра
OpenCV также дает нам фильтр Шарра, который имеет ту же скорость обработки, что и фильтр Собеля, но с более высокой точностью. Его можно рассматривать как улучшенную версию фильтра Собеля, ядро которого обычно:
В 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()
После запуска эффект следующий:Затем в направлении 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()
После запуска эффект следующий:
Наконец, это 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()
После запуска эффект следующий:
Разница между фильтром Шарра и фильтром Собеля заключается в том, что фильтр Собеля имеет низкую точность и небольшую структуру ядра, в то время как фильтр Шарра имеет более высокую точность, что можно найти в сравнении ниже.
Лапласианский фильтр
Фильтр Лапласа представляет собой производный оператор второго порядка, который обладает инвариантностью к вращению и может удовлетворять требованиям повышения резкости краев изображения в разных направлениях. Обычно сумма коэффициентов его операторов должна быть равна нулю. Например, операторная матрица ниже является оператором Лапласа, а сумма также равна 0.
Конкретный принцип заключается в следующем, предполагая, что наше изображение по-прежнему состоит из 9 пикселей p1-p9. Матрица оператора Лапласа и изображение будут такими, как показано ниже:
Даже если приблизительное значение производной точки 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()
После запуска эффект следующий:
Таким образом, фильтры Собеля и Шарра вычисляют значение приближенной производной первого порядка, а фильтр Лапласа вычисляет значение приближенной производной второго порядка.