how to optimized this code
Show older comments
I am new to matlab and trying to optimize this matlab code through optimization
this function is get location features using superpixel image and original image
Variable Sp is superpixel image matrix (512x512) , N_Sp is number of superpixel, im is original image matrix(512,512)
function [Features, Locpixels, distances] = LocationFeatures(Sp, N_Sp, im)
Features = zeros(3,N_Sp);
for i = 1 : N_Sp
[x, y] = find(Sp==i);
loc = (y-1)*size(im,1) + x;
Locpixels{i} = loc;
lengthofpix = length(loc);
Features(1,i) = mean(x) / size(im,1);
Features(2,i) = mean(y) / size(im,2);
Features(3,i) = lengthofpix;
end
temp = Features(1:2,:)';
parfor i = 1 : N_Sp
distances(i,:) = pdist2(temp, Features(1:2,i)')';
end
and then calculate features using ColorFeatures Function in blow but it too much time consume to calculate
function [Features] = ColorFeatures(Sp, N_Sp, Locpixels, im, imlab, distances)
Features = zeros(40, N_Sp);
im = im2double(im);
iml = mat2gray(imlab(:,:,1)); ima = mat2gray(imlab(:,:,2)); imb = mat2gray(imlab(:,:,3));
imR = im(:,:,1); imG = im(:,:,2); imB = im(:,:,3);
imhsv = rgb2hsv(im);
imh = mat2gray(imhsv(:,:,1)); ims = mat2gray(imhsv(:,:,2)); imv = mat2gray(imhsv(:,:,3));
expdist = exp(-1/0.16 * distances);
histrgb = zeros(N_Sp, 48);
histlab = zeros(N_Sp, 40);
histh = zeros(N_Sp, 8);
hists = zeros(N_Sp, 8);
for i = 1 : N_Sp
histrgb(i,:) = [imhist(imR(Locpixels{i}),16); imhist(imG(Locpixels{i}),16); imhist(imB(Locpixels{i}),16)] ./ length(Locpixels{i});
histlab(i,:) = [imhist(iml(Locpixels{i}),8); imhist(ima(Locpixels{i}),16); imhist(imb(Locpixels{i}),16)] ./ length(Locpixels{i});
histh(i,:) = imhist(imh(Locpixels{i}),8) ./ length(Locpixels{i});
hists(i,:) = imhist(ims(Locpixels{i}),8) ./ length(Locpixels{i});
end
for i = 1 : N_Sp
% The average color values
Features(1,i) = mean(imR(Locpixels{i}));
Features(2,i) = mean(imG(Locpixels{i}));
Features(3,i) = mean(imB(Locpixels{i}));
Features(4,i) = mean(iml(Locpixels{i}));
Features(5,i) = mean(ima(Locpixels{i}));
Features(6,i) = mean(imb(Locpixels{i}));
Features(7,i) = mean(imh(Locpixels{i}));
Features(8,i) = mean(ims(Locpixels{i}));
Features(9,i) = mean(imv(Locpixels{i}));
% Color Histogram Features
Features(10,i) = sum(chi_square_statistics_fast(histrgb(i,:),histrgb));
Features(11,i) = sum(chi_square_statistics_fast(histlab(i,:),histlab));
Features(12,i) = sum(chi_square_statistics_fast(histh(i,:),histh));
Features(13,i) = sum(chi_square_statistics_fast(hists(i,:),hists));
end
Rdist = zeros(N_Sp,N_Sp); Gdist = zeros(N_Sp,N_Sp); Bdist = zeros(N_Sp,N_Sp);
ldist = zeros(N_Sp,N_Sp); adist = zeros(N_Sp,N_Sp); bdist = zeros(N_Sp,N_Sp);
hdist = zeros(N_Sp,N_Sp); sdist = zeros(N_Sp,N_Sp); vdist = zeros(N_Sp,N_Sp);
for i = 1 : N_Sp
Rdist(i,:) = pdist2(Features(1,:)', Features(1,i));
Gdist(i,:) = pdist2(Features(2,:)', Features(2,i));
Bdist(i,:) = pdist2(Features(3,:)', Features(3,i));
ldist(i,:) = pdist2(Features(4,:)', Features(4,i));
adist(i,:) = pdist2(Features(5,:)', Features(5,i));
bdist(i,:) = pdist2(Features(6,:)', Features(6,i));
hdist(i,:) = pdist2(Features(7,:)', Features(7,i));
sdist(i,:) = pdist2(Features(8,:)', Features(8,i));
vdist(i,:) = pdist2(Features(9,:)', Features(9,i));
end
expR = exp(-1/0.16 * Rdist);
expG = exp(-1/0.16 * Gdist);
expB = exp(-1/0.16 * Bdist);
expl = exp(-1/0.16 * ldist);
expa = exp(-1/0.16 * adist);
expb = exp(-1/0.16 * bdist);
exph = exp(-1/0.16 * hdist);
exps = exp(-1/0.16 * sdist);
expv = exp(-1/0.16 * vdist);
for i = 1 : N_Sp
Features(14,i) = sum(Rdist(i,:)); %
Features(15,i) = sum(Gdist(i,:));
Features(16,i) = sum(Bdist(i,:));
Features(17,i) = sum(ldist(i,:));
Features(18,i) = sum(adist(i,:));
Features(19,i) = sum(bdist(i,:));
Features(20,i) = sum(hdist(i,:));
Features(21,i) = sum(sdist(i,:));
Features(22,i) = sum(vdist(i,:));
Features(23,i) = sum(Rdist(i,:) .* expdist(i,:)); % local contrast
Features(24,i) = sum(Gdist(i,:) .* expdist(i,:));
Features(25,i) = sum(Bdist(i,:) .* expdist(i,:));
Features(26,i) = sum(ldist(i,:) .* expdist(i,:));
Features(27,i) = sum(adist(i,:) .* expdist(i,:));
Features(28,i) = sum(bdist(i,:) .* expdist(i,:));
Features(29,i) = sum(hdist(i,:) .* expdist(i,:));
Features(30,i) = sum(sdist(i,:) .* expdist(i,:));
Features(31,i) = sum(vdist(i,:) .* expdist(i,:));
Features(32,i) = sum(distances(i,:) .* expR(i,:)); % element distribution
Features(33,i) = sum(distances(i,:) .* expG(i,:));
Features(34,i) = sum(distances(i,:) .* expB(i,:));
Features(35,i) = sum(distances(i,:) .* expl(i,:));
Features(36,i) = sum(distances(i,:) .* expa(i,:));
Features(37,i) = sum(distances(i,:) .* expb(i,:));
Features(38,i) = sum(distances(i,:) .* exph(i,:));
Features(39,i) = sum(distances(i,:) .* exps(i,:));
Features(40,i) = sum(distances(i,:) .* expv(i,:));
end
Can it be vectorized for lower computation time?
4 Comments
Rik
on 10 Jan 2023
Apart from the advice to change length to numel, I don't really see obvious ways to improve this code. Vectorized functions are generally only faster if there is a directly implemented method that works on an entire array. I don't recognize what this code is calculating to suggest a replacement with something like a convolutional filter.
The only thing you could try is to rework this code to allow parfor loops instead of for loops.
Jinto
on 10 Jan 2023
Dyuman Joshi
on 10 Jan 2023
Instead of defining every single element
iml = mat2gray(imlab(:,:,1)); ima = mat2gray(imlab(:,:,2)); imb = mat2gray(imlab(:,:,3));
imR = im(:,:,1); imG = im(:,:,2); imB = im(:,:,3);
imhsv = rgb2hsv(im);
imh = mat2gray(imhsv(:,:,1)); ims = mat2gray(imhsv(:,:,2)); imv = mat2gray(imhsv(:,:,3));
You can keep them in a cell array in the order required -
%perform operations on the whole data, rather than individually
imLAB=mat2gray(imlab);
imhsv = mat2gray(rgb2hsv(im));
%Order - R G B l a b h s v
IM={im(:,:,1); im(:,:,2); im(:,:,3); imLAB(:,:,1); imLAB(:,:,2); imLAB(:,:,3); ...
imhsv(:,:,1); imhsv(:,:,2); imhsv(:,:,3)};
and then do operations accordingly, using indices, get the results and then assign the final values.
@Jinto A couple of questions:
- What are your computer specs and what version of MATLAB are you running this on?
- How big is your image dataset? Does it still take too long if you run this for 1 or 2 images?
I would also consider sending a short email to the corresponding author of that paper and see if they can give you some clues as to why the code is running so inefficiently. It is likely they've run into the same issue.
Answers (0)
Categories
Find more on R Language in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!