Faster Image Processing?
3 次查看(过去 30 天)
显示 更早的评论
Hello,
I'm trying to make my code faster and I haven't been successful and I'm hoping that someone has great ideas.
I have 3D arrays: Image(512,512,60) and RefImage(1000,288,16).
I'm trying to update the 3D Image array based on the calculations using the values in RefImage pages(16 of them).
Here's the simplified version of what I'm trying to make it faster:
for i = 1:1000
for j = 1:288
RCPointer(varies depends on how many row and col are occupied) = pointer{j,i};
ImagePage(16 of them) = page{j,i} * ConstantMultiplier;
for k = 1:16
ImagePointer = (ImagePage(k)-1) * 262144 + RCPointer;
Pixel = Image(ImagePointer);
NewPixel = Pixel + RefImage(i,j,k);
Image(ImagePointer) = NewPixel;
end
end
end
Thanks for your ideas!
3 个评论
Catalytic
2024-2-3
编辑:Catalytic
2024-2-3
However, the main purpose should be be pretty clear from the simplified code above.
No, because code isn't enough to tell us what's going on. We need to see input data as well, so we can understand the size and shape of the matrix variables it contains. If you're going to provide simplified code, you need to provide simplified input data to go with it - in this case pointer, page, and ConstantMultiplier - and we should be able to run the code with the input you provide.
回答(2 个)
Constantino Carlos Reyes-Aldasoro
2024-2-2
Two nested for loops with images is not an efficient way to deal with matrices or images. The point of Matlab is to handle everything as a matrix. I.e.
a=ones(5,5);
b=2*a;
is efficient as opposed to
for k1=1:5
for k2=1:5
b(k1,k2) = a(k1,k2) *2;
end
end
Now, how do you handle the to and from matrices? You can use indices, i.e., addressing the matrix. For example
a= ones(5,5);
a(2:4,2:4) =2;
b= 2*a;
b(a==2) = 5;
disp (b)
In that way, you do not need to use for loops, and can directly operate in certain regions of the images/matrices (i.e. the address that you pass, in this case a==2)
I wrote a book on image analysis, addressing a matrix is part of chapter 1:
https://onlinelibrary.wiley.com/doi/epdf/10.1002/9781118657546.ch1
0 个评论
Matt J
2024-2-3
编辑:Matt J
2024-2-3
[m,n,p]=size(Image);
N=cellfun(@numel, pointer(:));
K=cell2mat( cellfun(@(q)q(:)', page(:),'uni',0)); %*ConstantMultiplier? No idea what that was doing
K=repelem(pointer,N,1);
[I,J]=ind2sub([m,n], vertcat(pointer{:}));
I=repmat(I,1,width(K));
J=repmat(J,1,width(K));
Update=accumarray([I(:),J(:),K(:)], RefImage(:), [m,n,p]);
Image = Image + Update;
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Image Processing Toolbox 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!