2017-09-09 6 views
0

イメージ全体に64x64スライディングウィンドウを適用し、そのウィンドウで最も一般的な色を出力したいと考えています。 immaximasは私が探しているだろうか?または、この関数は私にカラーブロックの位置を与えますか?私のヒューリスティックのimmaximasを使用して、イメージ内で最も一般的なカラーブロックを見つけますか?

アム例:immaximasドキュメントから

pkg load image; 
pkg load signal; 

i = imread('foo.jpg'); 

[r,c] = immaximas(i, 65); % radius=65 ie a 65x65 kernel correct? 
% I should now know the most common colour in 65x6 regions across the image right? 

答えて

1

ローカル空間の最大値を検索します。

...

ローカル空間の最大値を半径+ 1

* 幅 2の正方形領域内の全ての隣接値より大きいこと値を有する画像点として定義されますしたがってimmaximasは最も一般的な値を見つけることとは関係ありません。

数字のリストで最も一般的な要素をモードといいます。イメージの各ポイントで最も一般的な色を出力したい場合は、画像処理ツールボックスのnlfilterを使用します。

imode = nlfilter(i, [64 64], 'sliding', @mode); 

画像を使用して、モードを見つけ、次いで単一の値に画素を符号化することができuint8タイプの3チャンネルである場合。また、エンコードされた値に1を加えてゼロ以外の値のモードしか見つからないように、エッジで暗黙のゼロパディングを無視するとよいでしょう。

i = uint32(imread('peppers.png')); 

% encode 3 channel image into single channel 
ienc = 1+bitor(bitor(i(:,:,1), bitshift(i(:,:,2),8)), bitshift(i(:,:,3),16)); 

% find the mode 
imode = nlfilter(ienc, [64 64], @(x) mode(x(x~=0))); 

% decode single into 3 channel image 
idec = zeros(size(i)); 
idec(:,:,1) = bitand(uint32(255), imode(:,:,1)-1); 
idec(:,:,2) = bitshift(bitand(uint32(65280), imode(:,:,1)-1),-8); 
idec(:,:,3) = bitshift(bitand(uint32(16711680), imode(:,:,1)-1),-16); 
idec = uint8(idec); 

imshow(uint8(idec)); 

結果

enter image description here

enter image description here

+0

おかげで非常にあなたの例をはるかに高く評価された - 私はオクターブ/ Matlabのを学んでいます。これを作成する時間をとっていただきありがとうございます:) –

関連する問題