Image Matlab,使用索引而不是嵌套For循环(用于For)

Image Matlab,使用索引而不是嵌套For循环(用于For),image,algorithm,matlab,image-processing,Image,Algorithm,Matlab,Image Processing,所以最近我尝试使用索引而不是循环,因为它在matlab上看起来和感觉都快多了 所以我试图改变以下几点: for i =1:size(l,1) for j=1:size(l,2) if l(i,j,1)>200 && l(i,j,2)<40 && l(i,j,3)<40 l(i,j,1)=144;

所以最近我尝试使用索引而不是循环,因为它在matlab上看起来和感觉都快多了

所以我试图改变以下几点:

for i =1:size(l,1)
        for j=1:size(l,2)
                     if  l(i,j,1)>200 &&  l(i,j,2)<40 && l(i,j,3)<40
                          l(i,j,1)=144;
                          l(i,j,2)=0;
                          l(i,j,3)=0;

                     end
        end
end
i=1时的
:大小(l,1)
对于j=1:尺寸(l,2)
如果l(i,j,1)>200&&l(i,j,2)l(:,:,3));
p2(:,:,2)=(200l(:,:,2)&40>l(:,:,3));
p3(:,:,3)=(200l(:,:,2)&40>l(:,:,3));
pix(p1(:,:,1))=144;
pix(p2(:,:,2))=0;
pix(p3(:,:,3))=0;

这几乎是工作,我可以看到的图片,但颜色出现在两张图片不同。我的意思是,imshow(pix)和imshow(l)看起来并不完全一样。我真的看不出这个问题

这里有一个快速修复方法,使用向量引用矩阵元素引用的元素比您想要的要多。虽然它仍然有一个for循环,但它应该比您原来的方法更快

[ti,tj]=find(pix(:,:,1)>200 &  pix(:,:,2)<40 & pix(:,:,3)<40);
for k=1:length(ti)
    pix(ti(k),tj(k),:)=[144 0 0];
end
[ti,tj]=find(pix(:,:,1)>200&pix(:,:,2)这应该可以正常工作:

% This is how the data look like
q = randi(256, [1000, 1000, 3]);

% This is the desired outcome:
tic
qq = q;
for i = 1:size(q, 1)
        for j = 1:size(q, 2)
                     if  ((q(i, j, 1) > 200) && (q(i, j, 2) < 40) && (q(i, j, 3) < 40))
                          qq(i, j, 1) = 144;
                          qq(i, j, 2) = 0;
                          qq(i, j, 3) = 0;
                     end
        end
end
toc

% This is a faster solution    
tic
p1(:, :, 1) = (q(:, :, 1) > 200) & (q(:, :, 2) < 40) & (q(:, :, 3) < 40);
p2(:, :, 2) = p1(:, :, 1);
p3(:, :, 3) = p1(:, :, 1);
pix = q;
pix(p1(:)) = 144;
pix(p2(:)) = 0;
pix(p3(:)) = 0;
toc

% Check that the solution returns the desired outcome:    
all(pix(:) == qq(:))
sum(pix(:) ~= qq(:))
%数据就是这样的
q=randi(256[1000,1000,3]);
%这是理想的结果:
抽搐
qq=q;
对于i=1:尺寸(q,1)
对于j=1:尺寸(q,2)
如果((q(i,j,1)>200)&(q(i,j,2)<40)&(q(i,j,3)<40))
qq(i,j,1)=144;
qq(i,j,2)=0;
qq(i,j,3)=0;
结束
结束
结束
toc
%这是一个更快的解决方案
抽搐
p1(:,:,1)=(q(:,:,1)>200)和(q(:,:,2)<40)和(q(:,:,3)<40);
p2(:,:,2)=p1(:,:,1);
p3(:,:,3)=p1(:,:,1);
pix=q;
pix(p1(:)=144;
pix(p2(:)=0;
pix(p3(:)=0;
toc
%检查解决方案是否返回所需结果:
全部(pix(:)==qq(:)
总和(pix(:)~=qq(:)

这可能是对彩色贴图的重新缩放,因为如果您的图像…@natan我不明白您的意思。如果从第一部分删除第5行和第6行,然后从代码的第二部分删除第2行、第3行、第5行和第6行。图像看起来完全一样。关于这个垫子有什么见解吗哎呀,小心点:这个解决方案不会返回期望的结果。请重新检查,我的错误(其中pix=l)。
% This is how the data look like
q = randi(256, [1000, 1000, 3]);

% This is the desired outcome:
tic
qq = q;
for i = 1:size(q, 1)
        for j = 1:size(q, 2)
                     if  ((q(i, j, 1) > 200) && (q(i, j, 2) < 40) && (q(i, j, 3) < 40))
                          qq(i, j, 1) = 144;
                          qq(i, j, 2) = 0;
                          qq(i, j, 3) = 0;
                     end
        end
end
toc

% This is a faster solution    
tic
p1(:, :, 1) = (q(:, :, 1) > 200) & (q(:, :, 2) < 40) & (q(:, :, 3) < 40);
p2(:, :, 2) = p1(:, :, 1);
p3(:, :, 3) = p1(:, :, 1);
pix = q;
pix(p1(:)) = 144;
pix(p2(:)) = 0;
pix(p3(:)) = 0;
toc

% Check that the solution returns the desired outcome:    
all(pix(:) == qq(:))
sum(pix(:) ~= qq(:))