2014-10-19 3 views
0

Я пытаюсь запустить настраиваемый фильтр через изображение, используя функцию colfilt. Этот фильтр в основном запускает окно nxn через изображение и заменяет центральный пиксель на половину его минимальной и максимальной суммы. Это то, что код выглядит следующим образом:Ошибка использования функции colfilt в MatLab/Octave

colfilt(image, 3, "sliding", @(x) (min(x(:))+max(x(:)))/2) 

Однако, я получаю эту ошибку:

error: col2im: can't resize B in matrix sized (A_SIZE - BLOCK_SIZE +1) 
error: called from: 
error: /usr/share/octave/packages/image-2.2.1/col2im.m at line 143, column 9 
error: /usr/share/octave/packages/image-2.2.1/colfilt.m at line 152, column 9 

Если я заменить функцию на nfilter, как ниже

nlfilter(image, [n n], @(x) (min(x(:))+max(x(:)))/2) 

Это отлично работает, но это слишком медленно, поэтому я думаю, что первый вариант должен работать лучше.

Кто-нибудь знает, как заставить его работать?

Заранее спасибо.

+0

Похоже, что размер матрицы, к которой вы назначаете результат 'colfilt', должен быть размером A - blocks_size (3 в вашем случае) + 1 = размер A - 2, и у него нет таких Габаритные размеры. – Cheery

+0

Но я не назначаю результат какой-либо переменной – gcolucci

+0

Вы - нет, но col2im вызывается colfilt, и это так. Каковы размеры исходного изображения? Попробуйте использовать не только '3', но' [3 3] ' – Cheery

ответ

2

Необходимо более внимательно ознакомиться с документацией colfilt. Вот что говорит о возможности sliding:

B = colfilt(A,[M N],'sliding',FUN) rearranges each M-by-N sliding 
neighborhood of A into a column in a temporary matrix, and then applies 
the function FUN to this matrix. FUN must return a row vector containing 
a single value for each column in the temporary matrix. (Column 
compression functions such as SUM return the appropriate type of 
output.) colfilt then rearranges the vector returned by FUN into a 
matrix of the same size as A. 

Ключ предложение: FUN должен возвращать вектор-строку, содержащую одно значение для каждого столбца во временной матрице. Что делает colfilt, так это то, что он преобразует каждую окрестность пикселя в один столбец и объединяет все эти столбцы, которые будут помещены во временную матрицу. Поэтому каждый столбец представляет собой единую пиксельную окрестность. Таким образом, вам нужно написать свою анонимную функцию таким образом, что вывод будет представлять собой вектор с одной строкой, где каждый элемент в этом вектор-строке является выходным результатом того, что произойдет, если вы примените свою функцию к каждой окрестности пикселя, которая находится в каждом столбец этой временной матрицы. Таким образом, вам просто нужно изменить вашу анонимную функцию, чтобы сделать это вместо:

out = colfilt(image, [3 3], 'sliding', @(x) ((min(x)+max(x))/2)); 

Обратите внимание, что вам нужно указать второй вход в [3 3], а не только один ряд 3, как заметил в комментариях в вашей после. Это должно теперь самостоятельно найти минимум для каждого столбца, добавить это с максимальным количеством каждого столбца, а затем разделить на 2. Этот вектор-строка должен теперь выводить результат, который будет получен для каждой области пикселя, которую вы обработали.

+0

Спасибо за разъяснение! – gcolucci

Смежные вопросы