2017-07-28 2 views
1

私の手には次のイメージがあります。次のように私は、今、私はピクセルをどのようにトラバースできますか?

enter image description here

どのようにすることができ、ピクセルマスクを取得している

enter image description here

の画像の一部の画素をマークしている

enter image description here

私はその中にあるピクセルだけを通る尋ねる?

+0

元の質問も良かったと思っていましたので、私はどこから来ているのか疑問に思っていません。後続の質問を別の投稿に自由に投稿してください。私はあなたのためにそれらをupvote :) – informaton

答えて

3

元の質問:私は私が興味を持って画素のみを保存することができますどのように


...
質問:ステップ#2では、これらのピクセルをデータ構造(または何でも)に保存して、別の関数f2(I、d、p、q 、r)これらのピクセルに基づいてその画像上で何かを行うd。

は、注目画素を追跡するために、画像の論理的なマスクを使用してみてくださいバイナリマスクを作成します。私はここに、たとえば、ランダムな画像を作るよ

:それは、画像を保存して使用する方法を決定するのはあなた次第となります enter image description here

:ここ

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におけるこれらのピクセルを横断しようと思っている:私は投稿以来

EDITは

あなたは2番目の質問を追加しましたか?

Vectrorization

が白に全ての画素を設定する:

randImg(imgMaskForRGB) = 255;

を私の例では、私はで私のマスクで同時に注目画素の全てにアクセスベクトル化ファッション。

Iは、各画素のRGB値を取得するために、3Dマスクに私の2次元マスクを翻訳。つまり、このコードだった:

maskImg = zeros(size(randImg)); 
    imgMaskForRGB = repmat(imgMask,1,1,3); 

そして、関心の画像では、これらのすべての画素にアクセスするために、私はこの呼び出しを使用:

randImg(imgMaskForRGB) 

これらは興味のあなたのピクセルです。あなたが本当に一度に1つの画素を通過したい場合、あなたは常にでき

randImg(imgMaskForRGB) = randImg(imgMaskForRGB)/2; 

ループ

:あなたは1/2で、これらの値を分割したい場合は、このような何かを行うことができますdouble forループを使用してください:

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 
+0

しかし、今問題は、どのようにそれらのピクセルを横断するつもりですか? – anonymous

+0

私は次の画像への割り当てのピクセルをたどった。イメージマスクは、コードをベクトル化することができます。 'randImg(imgMaskForRGB);'各ピクセルを見るには、単純にdouble forループを実行して、一度に1つの注目ピクセルを取り出します。 – informaton

+0

'randImage'のすべてのピクセルをトラバースしています。私はマスクにあるピクセルだけを通過したいと思っていました。 – anonymous

1

大丈夫です。私はあなたがマスク内のすべての真のピクセルを反復処理したいバイナリマスク、マスク、を考えると、あなたは、少なくとも2つのオプションがあり、@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

3

これを解決しましたどちらもdouble forループの例よりも優れています。

1)論理インデックス。

I(mask) = 255; 

2)使用して見つけます。

linearIdx = find(mask); 
I(linearIdx) = 255; 
関連する問題