Быстрое вычисление градиента изображения в 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

Я пытался запустить его так: очистить все; закрыть все;

x=4000;N=1;
tic
for i=1:N
    one(x);
end
toc

Я обнаружил, что наибольшее количество времени было потраченооператор градиента Выписка (около 60%) от общего времени. Это заставило меня задуматься, как я могу оптимизировать свой код дальше ...

Я просмотрел несколько сайтов, таких как:Dgradient а такжеhttp://regularize.wordpress.com/2013/06/19/how-fast-can-you-calculate-the-gradient-of-an-image-in-matlab/

Однако Dgradient - это MEX-файл, и я не хочу его использовать. Я хотел написать свою собственную функцию градиента. Я читал в блогах, что оператор градиента в Matlab значительно медленнее и ускоряется с помощью shift & вычитаемая и разреженная матрица.

У меня нет знаний о разреженной матрице. Однако я попытался сделать это с помощью метода shift и substract. тем не мениеЯ уверен, что мой код неверен, Кто-нибудь может уточнить, какую разницу использует Matlab для расчета градиента? И покажи мне, как это сделать в моем коде?

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

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

Ответы на вопрос(4)

Ваш ответ на вопрос