答案 0 :(得分:3)
最初的问题:
如何只保存我感兴趣的像素?
...
问题:现在,在步骤#2中,我想将这些像素保存在数据结构(或者其他)中,以便我可以应用另一个函数f2(I,d,p,q,r)基于那些像素的那个图像d。
创建二进制掩码
尝试使用图像的逻辑蒙版来跟踪感兴趣的像素。
我会在这里组成一个随机图片:
randImg = rand(64,64,3);
imgMask = false(size(randImg(:,:,1)));
imgMask(:,[1:4:end]) = true; % take every four columns This would be your d.
% Show what we are talking about
maskImg = zeros(size(randImg));
imgMaskForRGB = repmat(imgMask,1,1,3);
maskImg(imgMaskForRGB) = randImg(imgMaskForRGB);
figure('name','Psychadelic');
subplot(2,1,1);
imagesc(randImg);
title('Random image');
subplot(2,1,2);
imagesc(maskImg);
title('Masked pixels of interest');
由您决定如何编写函数,由您决定如何存储和使用图像掩码(d
)。希望这个例子能让你理解它是如何完成的。
编辑
自从我发布以来,您添加了第二个问题:
但是,现在的问题是,我将如何遍历K中的那些像素?
<强> Vectrorization 强>
将所有像素设置为白色:
randImg(imgMaskForRGB) = 255;
在我的示例中,我以矢量化方式使用我的蒙版同时访问了所有感兴趣的像素。
我将2D蒙版转换为3D蒙版,以获取每个像素的RGB值。那就是这段代码:
maskImg = zeros(size(randImg));
imgMaskForRGB = repmat(imgMask,1,1,3);
然后,为了访问感兴趣的图像中的所有这些像素,我使用了这个调用:
randImg(imgMaskForRGB)
这些是你感兴趣的像素。如果你想将这些值除以1/2,你可以这样做:
randImg(imgMaskForRGB) = randImg(imgMaskForRGB)/2;
<强>循环强>
如果你真的想要遍历一次一个像素,你总是可以使用双循环:
for r=1:size(randImg,1)
for c=1:size(randImg,2)
if(imgMask(r,c)) % traverse all the pixels
curPixel = randImg(r,c,:); % grab the ones that are flagged
end
end
end
答案 1 :(得分:3)
给定一个二进制掩码,mask,你要迭代掩码中的所有真实像素,你至少有两个选项都比double for循环示例好。
1)逻辑索引。
I(mask) = 255;
2)使用find。
linearIdx = find(mask);
I(linearIdx) = 255;
答案 2 :(得分:1)
好。我已经使用@informaton,
的答案解决了这个问题I = imread('gray_bear.png');
J = rgb2gray(imread('marked_bear.png'));
mask = I-J;
for r=1:size(I,1)
for c=1:size(I,2)
if(mask(r,c))
I(r,c) = 255;
end
end
end
imshow(I);