2

0matlabに、、、128およびの3色の画像があります255。例えば:

255  255  255   255  128  255   0   255  255  128   0   255
255   0   255   255  128  255  255   0   255  128  255  255
255   0   255    0   128  255  255  255  255  128  255   0     
255  255   0    255  128  255  255   0   255  128  255  255
255   0    0    255  128   0   255  255   0   128  255   0     

まず、インデックスのピクセルをチェックしたいと思い(1,1)ます(1,5)

ピクセル値0(黒)がある場合は、インデックスのピクセルが(1,1)(グレー)に(1,5)変更され128、ない場合は、ピクセルが0(白)に変更されます。

次に、これらの手順をもう一度実行します。インデックスを、、、、、下までチェックしてから、次の、インデックス、、、、、下まで、次にインデックス(2,1)から(2,5)、、(3,1)へと進みます。(3,5)(1,6)(1,10)(2,6)(2,10)(1,11)(1,end)(2,11)(2,end)

4

2 に答える 2

3

これを順番に行う必要はありますか?(n, (5*m : 5*m +1)) の形式のグループごとにこれを行う必要があるようです。その場合、行列を 5 要素幅のブロックの 3D 行列に再形成することで、すべてのテストを同時に実行できます。また、「何もない場合、ピクセルは255(白)に変更されます」という意味ではなく、0.

あなたの画像が と呼ばれているとしますmyImage

numBlocks = numel(myImage)/(5*size(myImage,1));
% Generate a 3D matrix each of which is 5 elements long in dimension 2. Note reshape will throw an error if numblocks is fractional
foo = reshape(myImage,size(myImage,1),5,numBlocks); 
blackTest = any(foo==0,2);
result = blackTest * 128 + ~blackTest*255; % result for each block
output = reshape(repmat(result,[1 5 1]),size(myImage));

これにより、画像が 3D マトリックスに再編成されます。3D マトリックスの各「レイヤー」に対応する各サブマトリックスは 5 要素幅です。3 次元行列全体について、次元 2 の要素のいずれかがゼロであるかどうかをチェックしfoo、長さ 1 の論理行列を次元 2 に残します。foo論理 1 と 0 で構成され、MATLAB では数値の 1 と 0 として扱うこともできます。したがって、128 を掛けfooて (グレーの出力値の場合)、foo255 を掛けたものの論理反転を追加して、白の出力値を取得します。最後に、行列を繰り返して 5 要素幅のブロックに戻し、元の次元に戻します。

編集: コードのコメントに記載されているように、元の画像の幅が 5 ピクセルの倍数でない場合、このコードは機能しないことに注意してください。これを修正するには、特別なケースを作成するか、ループを使用して 5 要素幅の各ブロックをステップ実行する必要があります。実際、それは全体的により良いアプローチかもしれません:

index = 1;
output = zeros(size(myImage));

while index < size(myImage,2)
blockEnd = min(index+4,size(myImage,2));
blackTest = any(myImage(:,index:blockEnd)==0,2);
blackTest = blackTest(:,ones(1,5));
output(1:end,index:blockEnd) = blackTest * 128 + ~blackTest*255;
index = index+5;
end
于 2012-04-15T14:47:23.777 に答える
1
% generate matrix
rand_data = randi(10,10);
I = zeros(10);
I(rand_data < 6 & rand_data > 3) = 128;
I(rand_data >= 6) = 255;

% here's the code
I = reshape(I',5,[])';
mask = repmat(any(I == 0,2),5,1);
I(mask) = 128;
I(~mask) = 255;
I = reshape(I',10,[])';
于 2012-04-15T15:06:15.847 に答える