cv2.filter2D: нет результатов, если размер ядра слишком велик - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь научиться использовать OpenCV и следую основным учебным пособиям. Тестируя простой cv2.filter2D, у меня возникла проблема ... если размер ядра превышает определенное число, программа не выдаст никакого вывода.

Итак, я пишу что-то вроде:

img = cv2.imread('images/img.jpg')

kernel = np.ones((n,n),np.float32)/n**2
smoothed = cv2.filter2D(img,-1,kernel)

cv2.imshow('orig', img)
cv2.imshow('smoothed', smoothed)
cv2.waitKey(0)
cv2.destroyAllWindows()

и проблема в том, что при n> 11 сглаженное изображение не создается (я пытался сохранить его или показать, но не получил результатов). Пробовал с разными изображениями разных размеров, но всегда с одинаковым результатом. Что я здесь не так делаю? Спасибо!

РЕДАКТИРОВАТЬ: Хорошо, короткое обновление.
Скрипт работает нормально и выдает размытое изображение, когда я запускаю его из терминала (я использую Ubuntu 18.04 с OpenCv 4.1. 0). Проблема заключается в том, что когда я пытаюсь выполнить его в Pycharm, в этом случае выдается ошибка «Процесс завершен с кодом завершения 139 (прерван сигналом 11: SIGSEGV)», что должно указывать на какую-то проблему ... сегментации, какнасколько я понимаю? Извините за начальную неопределенность, я немного спешил и не заметил сообщения Pycharm!

РЕДАКТИРОВАТЬ: Новое обновление.
Как бы безумно это ни звучало, я пыталсязапустить скрипт как из терминала, так и из Pycharm, и теперь он не работает ни с одним из них! Честно говоря, я понятия не имею, как это возможно, насколько я помню, я ничего не изменил! В любом случае, если это все еще может быть полезно, при запуске из терминала sys.path будет:

['/home/lews/PycharmProjects/opencv/00_basics',
'/home/lews/PycharmProjects/tf_models/research',
'/home/lews/PycharmProjects/tf_models/research/slim',
'/home/lews/PycharmProjects/opencv/00_basics',
'/home/lews/anaconda3/envs/tf2/lib/python37.zip',
'/home/lews/anaconda3/envs/tf2/lib/python3.7',
'/home/lews/anaconda3/envs/tf2/lib/python3.7/lib-dynload',
'/home/lews/anaconda3/envs/tf2/lib/python3.7/site-packages']

, а из Pycharm:

['/home/lews/PycharmProjects/opencv/00_basics',
'/snap/pycharm-professional/159/helpers/pydev',
'/home/lews/PycharmProjects/opencv',
'/snap/pycharm-professional/159/helpers/pycharm_display',
'/snap/pycharm-professional/159/helpers/third_party/thriftpy',
'/snap/pycharm-professional/159/helpers/pydev',
'/home/lews/anaconda3/envs/tf2/lib/python37.zip',
'/home/lews/anaconda3/envs/tf2/lib/python3.7',
'/home/lews/anaconda3/envs/tf2/lib/python3.7/lib-dynload',
'/home/lews/anaconda3/envs/tf2/lib/python3.7/site-packages',
'/snap/pycharm-professional/159/helpers/pycharm_matplotlib_backend',
'/home/lews/anaconda3/envs/tf2/lib/python3.7/site-packages/IPython/extensions',
'/home/lews/PycharmProjects/opencv']

Опять же, ни один из них не работает, вв обоих случаях размытое изображение не получается. При запуске из терминала выдает ошибку:

Segmentation fault (core dumped)

, а с Pycharm, как я уже сказал, я получаю

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

1 Ответ

1 голос
/ 28 октября 2019

Ядро размером n = 11 огромно и вычислительно невероятно дорого для применения к изображению. Как правило, существуют верхние пределы размеров ядра для сверток, чтобы избежать необоснованно длительного времени обработки.

Согласно документации:

Функция использует алгоритм на основе DFT в случае достаточно больших ядер (~ 11 x 11 или больше) и прямой алгоритм (который использует механизм, полученный с помощью createLinearFilter ()) для небольших ядер.

Это подразумевает, что он должен производить некоторый вывод, хотя и с помощью алгоритма DFT. Возможно, альтернатива DFT не поддерживает тип пикселей float32?

...