Overcome for loops for fast processing

1 次查看(过去 30 天)
I have the following part of MATLAB code
skin_rgb = zeros(256.^3,1);
for i = [2000 : 2003,2008,2010:2011,2013:2015,2017:2018,2021,2024,2027:2041,2043,2045:2059,2061:2063]
I = imread(['skin_img',num2str(i),'.tif']);
[x,y,~]= size(I);
for l = 1:x
for j = 1:y
if (I(l,j,1) ~= 255 && I(l,j,2) ~= 255 && I(l,j,3) ~= 255)
aa = double([I(l,j,1) , I(l,j,2) , I(l,j,3)]);
[~,ee1] = ismember(aa,rgb_hist,'rows');
skin_rgb(ee1) = skin_rgb(ee1) + 1;
b1 = b1 + 1;
end
end
end
end
The output of the code is perfect. The issue is it is very slow. Inside the if loop the size of rgb_hist variable is 255.^3 x 3. Is there any way to get rid of the two nested for loops? As I am doing Image processing on high resolution image the variable x and y (different for each "i" iteration) have a big number in it.
Thank you

采纳的回答

Bruno Luong
Bruno Luong 2018-11-11
编辑:Bruno Luong 2018-11-14
skin_rgb = 0;
for i = [2000 : 2003,2008,2010:2011,2013:2015,2017:2018,2021,2024,2027:2041,2043,2045:2059,2061:2063]
I = imread(['skin_img',num2str(i),'.tif']);
RGB = reshape(double(I),[],3)+1;
skin_rgb = skin_rgb + accumarray(RGB,1,256+[0 0 0]);
end
skin_rgb = permute(skin_rgb,[3 2 1]);
skin_rgb = skin_rgb(:);

更多回答(1 个)

Walter Roberson
Walter Roberson 2018-11-11
skin_rgb = zeros(256.^3,1);
for i = [2000 : 2003, 2008, 2010:2011, 2013:2015, 2017:2018, 2021, 2024, 2027:2041, 2043, 2045:2059, 2061:2063]
I = imread(['skin_img',num2str(i),'.tif']);
r = 1 + double(I(:,:,1)); g = 1 + double(I(:,:,2)); b = 1 + double(I(:,:,3));
skin_rgb = skin_rgb + accumarray([r(:), g(:), b(:)], 1, [256.^3, 1]);
end
  15 个评论
Bruno Luong
Bruno Luong 2018-11-14
编辑:Bruno Luong 2018-11-14
Then your rgb_hist is wrong.
This test code returns 1 everytime
% Such simple generate thing that you never bother to post
[B,G,R] = ndgrid(1:256);
rgb_hist = [R(:),G(:),B(:)];
% Quick check for order
rgb_hist(1:10,:)
rgb_hist(end+(-9:0),:)
% Random data
I = floor(256*rand(100,100,3));
aa = 1 + [I(100,100,1),I(100,100,2),I(100,100,3)]
% Counting algo
skin_rgb = accumarray(aa,1,256+[0 0 0]);
skin_rgb = permute(skin_rgb,[3 2 1]);
skin_rgb = skin_rgb(:);
% Check
[a1,a2] = ismember(aa,rgb_hist,'rows');
skin_rgb(a2) % <- This returns correctly 1

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Images 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by