Расширение OpenCV отличается от scipy, matlab

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 помещает ядро ​​​​на один пиксель изображения 1 и расширяет его до того места, где ядро ​​равно 1, в то время как OpenCV помещает ядро ​​​​на каждый пиксель и устанавливает его на максимум своих соседей (когда ядро ​​равно 1).

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

Боковые примечания:

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

person poochon    schedule 03.06.2018    source источник
comment
Есть ли способ воспроизвести поведение OpenCV с помощью scipy? Конечно, просто создайте собственное ядро ​​(тот, который используется в OpenCV) и используйте его.   -  person Jeru Luke    schedule 03.06.2018


Ответы (1)


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

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

tker = np.array([[1,1,0],
                 [1,1,1],
                 [1,1,1]])
tker2 = np.rot90(tker, 2)
person Cris Luengo    schedule 03.06.2018
comment
Спасибо. Как насчет 3D-расширения, вращения по 2 осям? - person poochon; 04.06.2018
comment
сам себе отвечаю: перевернуть по всем осям: tker2 = tker[::-1,::-1,::-1] - person poochon; 04.06.2018