Tôi đã cố gắng tối ưu hóa mã của mình và nhận thấy rằng một trong các mã của tôi là một nút cổ chai. Mã của tôi là:Tính toán nhanh độ dốc của hình ảnh trong 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
Tôi đã cố gắng chạy như sau: xóa tất cả;
x=4000;N=1;
tic
for i=1:N
one(x);
end
toc
tôi thấy rằng số lượng lớn nhất của thời gian đã được tiêu thụ bởi các nhà điều hành dốc statement (khoảng 60%) trong tổng số thời gian. Vì vậy, nó đã cho tôi suy nghĩ làm thế nào tôi có thể tối ưu hóa mã của tôi hơn nữa ....
tôi tham khảo ý kiến vài trang web thích: Dgradient và http://regularize.wordpress.com/2013/06/19/how-fast-can-you-calculate-the-gradient-of-an-image-in-matlab/
Tuy nhiên Dgradient là một tập tin MEX và tôi không muốn sử dụng nó. Tôi muốn viết chức năng gradient của riêng tôi. Tôi đọc trong các blog rằng toán tử gradient trong MATLAB chậm hơn đáng kể và được tăng tốc bằng cách sử dụng shift & ma trận trừ và thưa thớt.
Tôi không có kiến thức về ma trận thưa thớt. Tuy nhiên tôi đã thử làm điều đó bằng cách sử dụng phương thức shift và substract. Tuy nhiên Tôi chắc chắn rằng mã của tôi là sai. Xin vui lòng bất cứ ai có thể làm rõ những loại khác biệt MATLAB sử dụng để tính toán gradient của nó? Và chỉ cho tôi cách làm điều đó trong mã của tôi?
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
Các bạn có thể xem mã và đề xuất cho tôi cách áp dụng chính xác không? Hoặc hướng dẫn tôi làm thế nào để làm như vậy bằng cách sử dụng ma trận thưa thớt?
bạn đã thử sử dụng 'diff' chưa? http://www.mathworks.com/help/matlab/ref/diff.html – Dan
diff hoạt động với mảng 1D và tôi đang làm việc trên Hình ảnh 2D hoặc 3D. Vui lòng giải thích cách khác biệt được áp dụng trong trường hợp của tôi? – roni
'khác biệt (I, 1,2)' khác biệt giữa các cột, tức là giống như 'dx1' của bạn. Xin vui lòng đọc liên kết doc tôi đăng, diff không chỉ áp dụng cho mảng 1D. – Dan