how to optimized this code

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

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.
@Rik Thanks to reply my question.
I'm trying to optimized this code (https://github.com/jhkim89/Saliency-HDCT). It is automatically detect saliency region and generate saliency map.
I just using original code for my project but it need too much time cost. So I want to optimized this code but hard to understand documentation, and apply it.
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.
Alvaro
Alvaro on 23 Jan 2023
Edited: Alvaro on 23 Jan 2023
@Jinto A couple of questions:
  1. What are your computer specs and what version of MATLAB are you running this on?
  2. 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.

Sign in to comment.

Answers (0)

Products

Release

R2015b

Asked:

on 10 Jan 2023

Edited:

on 23 Jan 2023

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!