如何遍历像素?

时间:2017-07-28 00:24:41

标签: matlab image-processing

假设我手中有以下图像。

enter image description here

我已经标记了图像的一些像素,如下所示,

enter image description here

现在,我已经获得了像素掩码,

enter image description here

如何仅浏览该掩码中的那些像素?

3 个答案:

答案 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');

这是它的样子: enter image description here

由您决定如何编写函数,由您决定如何存储和使用图像掩码(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);

enter image description here