Частичная свертка в MATLAB

У меня большая матрица (изображение) и маленький шаблон. Я хотел бы свернуть маленькую матрицу с большей матрицей. Например, синяя область — это раздел, который я хочу использовать для свертки. Другими словами, я могу использовать свертку для всего изображения, но, поскольку время процессора увеличивается, поэтому я хотел бы просто сосредоточиться на нужной синей части.

Есть ли какая-нибудь команда в MATLAB, которую можно использовать для этой свертки? Или как я могу заставить функцию свертки просто использовать этот конкретный нерегулярный участок для свертки.

введите здесь описание изображения


person Nicole    schedule 29.01.2013    source источник
comment
Если вы хотите повысить производительность своего кода свертки, пытались ли вы его профилировать? например, в conv2 вы используете single вместо double?   -  person bla    schedule 29.01.2013
comment
Поэтому я думаю, что вам лучше всего получить наименьший прямоугольный ограничивающий прямоугольник. conv2 не оптимизируется для разреженного ввода. Я думаю, что filter2 также не оптимизируется для разреженного ввода. Одна из причин в том, что он, вероятно, использует SIMD-инструкции. При использовании SIMD пропуск небольших отверстий на самом деле не ускоряет процесс.   -  person thang    schedule 29.01.2013
comment
Так что код этого парня помог мне в прошлом mathworks.com/matlabcentral /обмен файлами/. Не уверен, что это имеет отношение к вашему использованию. По сути, если вы объединяете что-то маленькое с чем-то большим, SVD можно использовать для разложения малого на отдельные компоненты...   -  person thang    schedule 29.01.2013
comment
этот поток несколько решает этот вопрос: mathworks.com/matlabcentral/answers/5011 хотя я не сказал бы, что это последнее слово в этом вопросе...   -  person bla    schedule 29.01.2013


Ответы (2)


Я сомневаюсь, что вы можете сделать неправильную форму (быстрая свертка выполняется с помощью 2D FFT, для которого потребуется квадратная область). Вы можете оптимизировать его, найдя ограничивающую рамку фигуры и, таким образом, отбросив пустую границу.

person nneonneo    schedule 29.01.2013
comment
@nneonneo: На самом деле моя матрица представляет собой очень большую трехмерную матрицу, и мне нужно повторить эту свертку несколько раз. Вот почему я пытаюсь игнорировать внешнюю границу. - person Nicole; 29.01.2013
comment
-1. на самом деле, в целом неверно, что использование теоремы свертки делает ее быстрее, а conv2 не использует fft. - person thang; 29.01.2013
comment
Итак, я не знал, что conv2 не использовал БПФ. Почему это? Возможно, вы могли бы просветить меня, почему не будет быстрее использовать БПФ для вычисления свертки. - person nneonneo; 29.01.2013
comment
насколько быстро можно свернуть фильтр mxm с изображением nxn напрямую? как быстро сделать fft2 на образе nxn (пока даже не считайте умножение и ifft2)? когда одно больше другого? когда другой больше одного? - person thang; 29.01.2013
comment
@thang и nneonneo: я уверен, что использование fft может ускорить свертку, но в моем алгоритме важны даже секунды! Я уже реализовал fft в своем алгоритме, но я хочу избежать этой области NaN!! - person Nicole; 29.01.2013

@ Николь, я бы выбрал fft2(im).*fft(smallIm), что эквивалентно conv2(im, smallIm).
что касается распознавания неправильной формы, вы можете использовать обнаружение краев, например, canny, и находить значения большинства (левых, правых, верхних, нижних) точек,
поскольку canny возвращает двоичное (1,0) изображение и подготовьте ограничивающую рамку, используя значения. однако это займет некоторое время, чтобы создать.
и я не уверен, насколько это будет быстрее.

person Gilad    schedule 30.01.2013