2009-10-28 10 views
12

私は256x256イメージを持っており、それをそれぞれ128x128の4つのブロックに分割し、それらをA1からA4として扱いたいと思います。今私はそれらを別々に呼び出し、それらの上でいくつかの操作をしたいと思います。私はこれがblkproc機能を使って行うことができることを知っています - しかし、どれくらい正確ですか?イメージをMATLABでブロックに分割する方法は?

私はblkprocのように電話しますか?

B=blkproc(I,[4 4],?) 

私は「?」の代わりに何を置くか、そしてどのように私が作成した4つのブロックに取り組むことができますか?

答えて

11

(および非推奨blkprocが)Image Processing Toolboxで両方の機能しているあなたが分割したい場合は、私が

...私は追加のツールボックスを必要としない基本的なMATLABのソリューションを追加しようと思いましたマトリクスをサブマトリクスに分割する方法の1つは、mat2cellを使用してマトリクスを分割し、各サブマトリクスをセル配列のセルに格納することです。あなたのケースでは、構文は次のようになります。

C = mat2cell(I, [128 128], [128 128]); 

C今、各セルはIの128・バイ・128部分行列を保存すると2行2列のセル配列です。各セルで操作を実行する場合は、関数cellfunを使用します。たとえば、あなたは、各部分行列内の値の平均を取るしたい場合は、次の操作を行います。

meanValues = cellfun(@(x) mean(x(:)), C); 

最初の引数はまず列ベクトルに、各部分行列を整形し、anonymous functionからfunction handleです平均を取る。出力は、各部分行列の平均値の2行2列の行列です。あなたはcellfunに渡す関数は、セル毎に異なるサイズや種類の出力を作成した場合、cellfunはそれらを連結し、問題を持っていますし、エラーがスローされます:あなたは、コールの終わりまでに..., 'UniformOutput', false);を追加する場合

??? Error using ==> cellfun 
Non-scalar in Uniform output, at index 1, output 1. 
Set 'UniformOutput' to false. 

cellfunである場合、上記の場合の出力は、各サブマトリックスで演算を実行した結果を含むセル配列の2行2列のセル配列になります。

3

myImageは、あなたの256×256の画像であれば、それは

image_top_left = myImage(1:128,1:128); 
image_top_right = myImage(1:128,129:256); 
image_bottom_left = myImage(129:256,1:128); 
image_bottom_right = myImage(129:256,129:256); 

のではないでしょうか?

6

blockprocは、blkproc(これは非推奨)の新しい名前です。イメージ内の各ブロックに関数を適用するために使用できます。あなたは私が8×8ブロックに行列を分割し、各ブロックの平均値を計算したい場合たとえば、あなたはこれを行うだろう:

B=blockproc(I, [8 8], @(x) mean(x.data(:))); 

Bは、ブロックの手段を含む行列です。ここで注意すべき

2つのこと:

  • 指定[8 8]ブロックのサイズではなく、ブロックのを指定します。

  • blockprocに渡す機能の外にブロック自体にアクセスすることはできません。あなたがブロック自身が必要な場合はエイドリアンが示唆したように、あなたがしなければならない。もちろん

    A1=I(1:128, 1:128); 
    A2=I(129:256, 1:128); 
    A3=I(1:128, 129:256); 
    A4=I(129:256, 129:256); 
    

    、実際のプログラムでは、あなたはおそらくループを使用して、これを行う必要があります。

  • blockproc以来
+2

Image Processing Toolboxの古いバージョンをBLKPROC関数で使用している場合、上記の例の構文は次のように変更されます: 'B = blkproc(I、[8 8]、@(x)mean( x(:))); ' – gnovice

1

それは、256 * 256だけでなく、すべてのサイズの画像に対してプログラムを動作させる方が良いでしょう。

[row, col]=size(your_image); mr = round(row/2); % median of rows mc = round(col/2); % median of columns % Now divide your image and call each of them separately and do what ever you want top_left = your_image(1:mr , 1:mc); top_right = your_image(1:mr , (mc+1):col); bot_left = your_image((mr+1):row , 1:mc); bot_right = your_image((mr+1):row , (mc+1):col); % final stage is to combining these parts again to return to its original shape Back_to_original = [top_left,top_right ; bot_left,bot_right];

%これはあなたのために役立つことを願っています。

関連する問題