2016-06-25 2 views
1

アイデアは量子化マトリクス(8x8)を(コサイン変換された)画像にブロックごとに適用するjpeg圧縮に由来します。matlabのblockprocを使用して8x8行列で画像を量子化する方法は?

funQY = @(block_struct) (block_struct.data)./quantY; 
QY = blockproc(dctY, [8 8], funQY); 

dctYは、画像の輝度(2856x4290)を表す2Dマトリックスです。 quantYは、対応する量子化行列(8×8)である。

エラーメッセージには、行列の寸法が一致しないと表示されます。 block_struct.dataはdctYからの8x8ブロックを表していませんか?もしそうなら、それはなぜ8x8マトリックスによって分けられないのですか?私の間違いは何ですか?

+1

「4290」は8の倍数ではないためです。 – beaker

+0

スクリプト全体と画像を共有できますか? – Royi

答えて

2

@beaker noted in a commentと同じ理由で、イメージサイズがブロックのサイズで割り切れないことが原因です。ここでは、blockprocに関数に渡された各ブロックのサイズを確認し、簡単な例です:あなたが一番右側に見ることができるように

dctY = rand(24,34); % first dim is divisible, second is not 
funtmp = @(block_struct) size(block_struct.data); 
blockproc(dctY,[8 8],funtmp) 

は、これは、各ブロックの最後のブロックを

ans = 

    8  8  8  8  8  8  8  8  8  2 
    8  8  8  8  8  8  8  8  8  2 
    8  8  8  8  8  8  8  8  8  2 

を返します。行は、サイズが[8, 2]の部分的なものです。

あなたはthe PadPartialBlocks option of blockprocを使用することができます。

'PadPartialBlocks' A logical scalar. When set to true, blockproc will 
        pad partial blocks to make them full-sized (M-by-N) 
        blocks. Partial blocks arise when the image size 
        is not exactly divisible by the block size. If 
        they exist, partial blocks will lie along the right 
        and bottom edge of the image. The default is 
        false, meaning the partial blocks are not padded, 
        but processed as-is. 

        blockproc uses zeros to pad partial blocks when 
        necessary. 

これは、アプリケーションに応じて、

>> blockproc(dctY,[8 8],funtmp,'padpartialblocks',true) 

ans = 

    8  8  8  8  8  8  8  8  8  8 
    8  8  8  8  8  8  8  8  8  8 
    8  8  8  8  8  8  8  8  8  8 

になり、あなたは最後の部分ブロックをオフにトリミングではなく、与えられたとパディングとしたほうが良いかもしれません値。オプションでTrimBorderBorderSizeオプションを使用してこれを実行することができます。これらはピクセルを対称的に削除します。

+1

いくつかのピクセルでイメージを8で割り切れるように問題を解決しました。ありがとう! – Boernii

関連する問題