这个想法来自jpeg压缩,你可以将量化矩阵(8x8)块式地应用于(余弦变换的)图像。
funQY = @(block_struct) (block_struct.data)./quantY;
QY = blockproc(dctY, [8 8], funQY);
dctY是表示图片亮度的二维矩阵(2856x4290)。 quantY是相应的量化矩阵(8x8)。
错误消息表明矩阵尺寸不一致。 block_struct.data不代表dctY的8x8块吗?如果是这样,为什么它不能被8x8矩阵划分?这里我的错误是什么?
答案 0 :(得分: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
根据您的应用,您可能最好修剪掉最后一个部分块,而不是使用给定值填充。您可以选择使用TrimBorder
和BorderSize
选项执行此操作,这些选项会对称地修剪像素。