2013-03-26 2 views
0

мне нужно, чтобы получить 1-D профиль кругового изображения, например, 256x256 греха (R) изображение 256x256 sin(R) imageпрофиль кругового изображения - более эффективный способ сделать это?

Я написал функцию MatLab для выполнения этой задачи, но это оказывается очень не эффективным , Функция усредняет по радиусным интервалам исходных изображений.

Профилировщик matlab показывает, что первая строка в контуре [indxs = find (...)] занимает ~ 86% от времени работы.

Мне нужно запустить функцию на нескольких тысячах имитированных изображений (несколько больше 256x256), и для завершения требуется очень много времени.

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

я также пытался преобразовать функцию в C++ & MEX файл с помощью MATLAB кодировщика , но это заняло больше времени (x3) для выполнения этой задачи, может быть потому, что суб-функции- «findC» использует некоторые 2D-БПФ в найдите центр изображения.

Спасибо вам все, Dudas

Моя функция Matlab:

function [sig R_axis Center]= Im2Polar (imR,ch,Center_Nblock) 
% Converts Circular image to 1-D sig 
% based on true image values w/o interpolation 

% Input - 
% imR - circular sinuns image 
% ch - number of data-points in output signal (sig) 
% Center_Nblock - a varible related to the image center finding method 

% Output - 
% sig - 1D vector of the circular image profile 
% R_axis - axis data-points for sig 
% Center - image center in pixels 


[Mr Nr] = size(imR); % size of rectangular image 
[Center]=findC(imR,Center_Nblock); 
Xc=Center(1); 
Yc=Center(2); 

rMax=sqrt((Mr/2)^2 + (Nr/2)^2); 

x=[0:1:Mr-1]-Xc+1; 
y=[0:1:Nr-1]-Yc+1; 

[X,Y]=meshgrid(x,y); 
[TH,R] = cart2pol(X,Y); 

% Assembling 1-D signal 
sig=single([]); 
ii=1; 
dr=floor(rMax)/ch; 
V=dr:dr:floor(rMax); 

for v=V 
    indxs=find((v-dr)<=R & R<v);** 
    sig(ii)=mean(imR(indxs)); 
    Nvals(ii)=length(indxs); 

    ii=ii+1; 
end %for v 

R_axis=V-dr/2; 

end % of function 
+0

Ну, с одной стороны, вы можете просто удалить это 'find' и напрямую использовать логический индекс (заменив третью строку в цикле на' Nvals (ii) = sum (idxs) '). MATLAB часто подчеркивает 'find' в окне редактора и говорит вам, что он медленный. – wakjah

+0

Было бы неплохо показать пример входных переменных и функцию «findC». – tashuhka

+0

@ wakjah- Nvals не является частью алгоритма, это просто управляющая переменная, которая сообщает мне, сколько баллов было усреднено для каждого значения выходного сигнала. во всяком случае, Ive также попытался: 'sig1 (ii) = mean (imR ((v-dr) <= R & R Dudas

ответ

1

Исходя из замечаний, вот пример того, что я мог бы попробовать. Давайте работать с примером 9x9. Предположим, у вас есть следующее кольцевое пространство.

A = 

0  0  0  0  0  0  0  0  0 
0  0  1  1  1  1  1  0  0 
0  1  1  1  0  1  1  1  0 
0  1  1  0  0  0  1  1  0 
0  1  0  0  0  0  0  1  0 
0  1  1  0  0  0  1  1  0 
0  1  1  1  0  1  1  1  0 
0  0  1  1  1  1  1  0  0 
0  0  0  0  0  0  0  0  0 

Тогда индексы вашего рода маски являются, позволяет сказать, [кп]

>> [k n] 

ans = 

3  2 
4  2 
5  2 
6  2 
7  2 
2  3 
3  3 
4  3 
6  3 
7  3 
8  3 
2  4 
3  4 
7  4 
8  4 
2  5 
8  5 
2  6 
3  6 
7  6 
8  6 
2  7 
3  7 
4  7 
6  7 
7  7 
8  7 
3  8 
4  8 
5  8 
6  8 
7  8 

Теперь есть 9x9 матрицу нулей на руки называется B, мы можем перенести все это над к слева на один пиксель следующим образом, используя формулу (i + 9 * (j-1)), чтобы преобразовать двойной индекс в один индекс.

>> B=zeros(9,9); 
>> B((k)+9*(n-2))=1 

B = 

0  0  0  0  0  0  0  0  0 
0  1  1  1  1  1  0  0  0 
1  1  1  0  1  1  1  0  0 
1  1  0  0  0  1  1  0  0 
1  0  0  0  0  0  1  0  0 
1  1  0  0  0  1  1  0  0 
1  1  1  0  1  1  1  0  0 
0  1  1  1  1  1  0  0  0 
0  0  0  0  0  0  0  0  0 

Или двигаться вниз и вправо следующим

>> B=zeros(9,9); 
>> B((k+1)+9*(n-0))=1 

B = 

0  0  0  0  0  0  0  0  0 
0  0  0  0  0  0  0  0  0 
0  0  0  1  1  1  1  1  0 
0  0  1  1  1  0  1  1  1 
0  0  1  1  0  0  0  1  1 
0  0  1  0  0  0  0  0  1 
0  0  1  1  0  0  0  1  1 
0  0  1  1  1  0  1  1  1 
0  0  0  1  1  1  1  1  0 

Пока она не выходит за пределы, вы должны быть в состоянии перенести один кольцевой маску вокруг с простым добавлением к поместите центр в центр изображения.

+0

Привет @bogle, 10x для примера. как правило, центр колец может смещаться в субпиксельных единицах. поэтому это частичное решение задачи. (мне нужно точно рассчитать фазу синуса) плохо проверьте, что значение округления колец центра s до ближайшего пикселя по результатам. – Dudas

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