0

そのため、最近、 for ループの代わりにインデックスを使用して作業しようとしています。

だから私は以下を変更しようとしています;

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

これに:

p1(:,:,1)= (200 < l(:, :,1) & 40 > l(:, :,2) & 40 > l(:, :,3)) ;
p2(:,:,2)= (200 < l(:, :,1) & 40 > l(:, :,2) & 40 > l(:, :,3));
p3(:,:,3)= (200 < l(:, :,1) & 40 > l(:, :,2) & 40 > l(:, :,3));
pix(p1(:,:,1))=144;
pix(p2(:,:,2))=0;
pix(p3(:,:,3))=0;

それはほとんど機能しており、写真を見ることができますが、両方の写真で色が異なって見えます. つまり、imshow(pix) は imshow(l) とまったく同じには見えません。私は本当に問題を見つけることができません。

4

2 に答える 2

0

これはうまくいくはずです:

% 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(:))
于 2013-10-29T23:46:01.667 に答える