Преобразование RGB в норму RGB. векторизации - PullRequest
3 голосов
/ 23 октября 2011

Я пишу фрагмент кода, который должен трансформироваться из изображения RGB в нормализованное пространство rgb. Я работаю с форматом для , но он работает слишком медленно, и мне нужно оценить множество изображений. Я пытаюсь векторизовать полную функцию, чтобы ускорить ее. На данный момент у меня есть следующее:

     R = im(:,:,1);
     G = im(:,:,2);
     B = im(:,:,3);

     r=reshape(R,[],1);
     g=reshape(G,[],1);
     b=reshape(B,[],1);

     clear R G B;

     VNormalizedRed = r(:)/(r(:)+g(:)+b(:));
     VNormalizedGreen = g(:)/(r(:)+g(:)+b(:));
     VNormalizedBlue = b(:)/(r(:)+g(:)+b(:));

     NormalizedRed = reshape(VNormalizedRed,height,width);
     NormalizedGreen = reshape(VNormalizedGreen,height,width);
     NormalizedBlue = reshape(VNormalizedBlue,height,width);

Основная проблема заключается в том, что когда он достигает VNormalizedRed = r(:)/(r(:)+g(:)+b(:));, он отображает ошибку нехватки памяти (что действительно странно, потому что я только что освободил три вектора одинакового размера). Были ошибки? (* 1 007 * решена )

Возможно ли сделать тот же процесс более эффективно?

Изменить:

После использования предложений Мартина я обнаружил, что функция изменения формы не нужна, и я могу сделать то же самое с помощью простого кода:

     R = im(:,:,1);
     G = im(:,:,2);
     B = im(:,:,3);

     NormalizedRed = R(:,:)./sqrt(R(:,:).^2+G(:,:).^2+B(:,:).^2);
     NormalizedGreen = G(:,:)./sqrt(R(:,:).^2+G(:,:).^2+B(:,:).^2);
     NormalizedBlue = B(:,:)./sqrt(R(:,:).^2+G(:,:).^2+B(:,:).^2);

     norm(:,:,1) = NormalizedRed(:,:);
     norm(:,:,2) = NormalizedGreen(:,:);
     norm(:,:,3) = NormalizedBlue(:,:);

Ответы [ 2 ]

5 голосов
/ 23 октября 2011

Полагаю, вы хотите

VNormalizedRed = r(:)./(r(:)+g(:)+b(:));

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

1 голос
/ 24 октября 2011

Весь ваш первый код можно переписать в одну векторизованную строку:

im_normalized = bsxfun(@rdivide, im, sum(im,3,'native'));

Ваша вторая слегка измененная версия как:

im_normalized = bsxfun(@rdivide, im, sqrt(sum(im.^2,3,'native')));

Кстати, вы должны знать, какой тип данных используется для изображения, в противном случае можно получить неожиданные результаты (например, из-за целочисленного деления). Поэтому я бы преобразовал изображение в double перед выполнением расчетов нормализации:

im = im2double(im);
...