Предположим, что у меня есть матрица изображений RGB, и я хочу применить к ней некоторые пространственные фильтры. В общем, я хочу применить элементарные операции (обратите внимание, что это назначение в колледже, и мне не разрешено использовать какие-либо встроенные функции, доступные в панели инструментов Image Processing). Я решил написать фильтры как функции, а затем применить bsxfun
к этим функциям на изображении.Как применять элементарные операции без использования для циклов и без влияния на скорость
Простой пример был бы этим:
Я хочу, чтобы добавить 50 все уровни серых изображения, а затем заменить все уровни серых с выше 200 с 200. Вот мой код:
a='C:\Users\sepideh\Desktop\IP_abadpour\S45C-113050518040.jpg';
b=imread(a);
b(:,:,1)=b(:,:,1)+50;
b(:,:,2)=b(:,:,2)+50;
b(:,:,3)=b(:,:,3)+50;
c=reshape(b,[],1);
d=bsxfun(@test,c,200);
test
является функция в таком виде:
function Out = test(in,a)
if in>a
in=200;
end
Out = in;
end
Этот код не будет работать, потому что во второй строке «в> а» матрица, имеющая 0 и 1. (я имею в виду все элементы не 1 и не должны быть), поэтому отладчик не будет входить в th e if
заявление.
Не могли бы вы посоветовать мне, как писать эту функцию и как применять пространственный и четкий анализ изображения, не влияя на производительность и скорость выполнения?
Хорошо, что функция, которую вы предложили, работает хорошо, за исключением того, что функция max должна быть заменена на min.But еще один вопрос поднялся. Почему моя функция не работает. Я имею в виду, что если вы остановите отладчик в funtion, вы увидите, что «in» не является скаляром и является матрицей при вызове теста, и вы сказали: нет ничего плохого в вашей функции, поскольку она в настоящее время написана ?? !!! !! – sepideh
@sepideh О, ты прав, мой плохой! См. Мое редактирование. –