これを順番に行う必要はありますか?(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
て (グレーの出力値の場合)、foo
255 を掛けたものの論理反転を追加して、白の出力値を取得します。最後に、行列を繰り返して 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