Расширение OpenCV отличается от scipy, matlab - PullRequest
0 голосов
/ 03 июня 2018
import numpy as np
import cv2
import scipy.ndimage as sn

timg = np.array([[0,0,0,0],
                 [0,0,1,0],
                 [0,0,0,0],
                 [0,0,0,0]])

tker = np.array([[1,1,0],
                 [1,1,1],
                 [1,1,1]])

scipy.ndimage:

>>> print(sn.morphology.binary_dilation(timg,tker).astype(int))

[[0 1 1 0]
 [0 1 1 1]
 [0 1 1 1]
 [0 0 0 0]]

OpenCV:

>>> print(cv2.dilate(timg.astype(np.uint8), tker.astype(np.uint8)))

[[0 1 1 1]
 [0 1 1 1]
 [0 0 1 1]
 [0 0 0 0]]

Кажется, что ndimage помещает ядро ​​в один пиксель изображения и расширяет его до тех пор, покаkernel равен 1, в то время как OpenCV помещает ядро ​​в каждый пиксель и устанавливает его на максимум своих соседей (когда ядро ​​равно 1).

Какое поведение является правильным? Анимация Википедии , кажется, поддерживает OpenCV.Если я вызываю неправильные функции, есть ли способ воспроизвести поведение OpenCV с помощью scipy?

Примечания:

  • matlab ведет себя как scipy
  • поведение scipyтакже происходит в grey_dilation (хотя я бы не ожидал, что это изменит поведение)

1 Ответ

0 голосов
/ 03 июня 2018

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

Эти две библиотеки используют противоположные определения расширения.Чтобы перейти от одного к другому, отразите структурирующий элемент.Обратите внимание, что в 2D зеркальное отображение аналогично повороту на 180 градусов:

tker = np.array([[1,1,0],
                 [1,1,1],
                 [1,1,1]])
tker2 = np.rot90(tker, 2)
...