Próbowałem zoptymalizować mój kod i odkryłem, że jeden z moich kodów jest wąskim gardłem. Mój kod to:Szybkie obliczanie gradientu obrazu w Matlab
function [] = one(x)
I = imread('coins.png');
I = double(I);
I = imresize(I,[x x]);
sig=.8; % scale parameter in Gaussian kernel
G=fspecial('gaussian',15,sig); % Caussian kernel
Img_smooth=conv2(I,G,'same'); % smooth image by Gaussiin convolution
[Ix,Iy]=gradient(Img_smooth);
f=Ix.^2+Iy.^2;
g=1./(1+f); % edge indicator function.
end
Próbowałem uruchomić go tak: wszystko jasne; blisko wszystkich;
x=4000;N=1;
tic
for i=1:N
one(x);
end
toc
okazało się, że największa ilość czasu spożywane przez operatora gradientu rachunku (około 60%) do całkowitego czasu. Więc to dało mi do myślenia jak mogę dalej zoptymalizować kod ....
I konsultacje kilka miejsc jak: Dgradient i http://regularize.wordpress.com/2013/06/19/how-fast-can-you-calculate-the-gradient-of-an-image-in-matlab/
Jednak Dgradient plik jest MEX i nie chcę go używać. Chciałem napisać własną funkcję gradientu. Czytałem na blogach, że operator gradientu w Matlab jest znacznie wolniejszy i można go przyspieszyć za pomocą odejmowanej i rzadkiej macierzy przesunięcia.
Nie mam wiedzy na temat macierzy rzadkiej. Jednak próbowałem to zrobić, używając metody shift i substract. Jednak Jestem pewien, że mój kod jest nieprawidłowy. Czy ktoś mógłby wyjaśnić, jakiego rodzaju różnica używa matlab do obliczenia gradientu? I pokaż mi, jak to zrobić w moim kodzie?
clc;clear all;close all;
I = imread('coins.png');
I = double(I(:,:,1));
I = imresize(I,[4 4]);
tic
[dx dy] = gradient(I);
toc
tic
%//Doing forward difference on both directions
dx1 = [I(:,2:end) I(:,end)] - I;
dy1 = [I(2:end,:);I(end,:)] - I;
toc
Proszę spojrzeć na kod i zasugerować, jak go poprawnie zastosować? Albo wskazujesz mi, jak to zrobić, używając rzadkiej matrycy?
Czy próbowałeś używać 'diff'? http://www.mathworks.com/help/matlab/ref/diff.html – Dan
diff działa z tablicą 1D i pracuję nad obrazem 2D lub 3D. Proszę wyjaśnić, w jaki sposób różnica ma zastosowanie w moim przypadku? – roni
'diff (I, 1,2)' różnica między kolumnami, tj. Taka sama jak twoja 'dx1'. Przeczytaj przeczytany link do dokumentu, diff nie dotyczy tylko tablic 1D. – Dan