我试图优化我的代码,发现我的一个代码是一个瓶颈。我的代码是:
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 中的梯度算子明显较慢,并且可以通过使用移位和减法以及稀疏矩阵来加速。
我不了解稀疏矩阵。但是我确实尝试使用移位和减法方法来做到这一点。但是我很确定我的代码是错误的。请任何人都可以澄清一下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
请你们看看代码并建议我如何正确应用它?或者指导我如何使用稀疏矩阵来做到这一点?