【发布时间】:2013-09-24 03:23:25
【问题描述】:
我试图优化我的代码,发现我的一个代码是一个瓶颈。我的代码是:
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
请你们看看代码并建议我如何正确应用它?或者指导我如何使用稀疏矩阵来做到这一点?
【问题讨论】:
-
你试过只使用
diff吗? mathworks.com/help/matlab/ref/diff.html -
diff 适用于 1D 数组,我正在处理 2D 或 3D 图像。请解释 diff 如何适用于我的情况?
-
diff(I,1,2)列之间的差异,即与您的dx1相同。请阅读我发布的文档链接,差异不仅适用于一维数组。 -
感谢您的帮助。我会通过它让你知道
-
@Dan 请检查我的答案并告诉我
标签: matlab optimization image-processing gradient sparse-matrix