将图像划分为非重叠块,并在每个块上应用2D DWT

时间:2019-03-24 14:46:53

标签: image matlab image-processing dwt

我正在创建图像拼接检测软件,因此需要将图像划分为不重叠的块,并在图像的每个块上应用离散迈耶小波变换

我尝试使用blockproc函数来执行此操作,但是没有结果:

I = imread('pears.png');

fun = @(block_struct)...
    dwt2(block_struct.data,'dmey');

C = blockproc(I,[64 64],fun);

那么如何使用上述代码访问[cA,cH,cV,cD的{​​{1}}]?

1 个答案:

答案 0 :(得分:1)

blockproc假定您正在输出实际图像。您不能将其用于多个输出。如果您确实希望此方法与blockproc一起使用,那么不幸的是,您需要调用四次blockproc,每次都提取方向的不同系数集。另请注意,二维DWT仅适用于灰度图像,因此您需要先转换为灰度,然后再进行实际处理。您选择的梨图像是彩色/ RGB图像。

我想参考这篇文章,了解如何在给定输入功能How do I get the second return value from a function without using temporary variables?的情况下选择第N个输出。您将需要将此代码保存到名为nth_output.m的文件中,该文件允许您以编程方式从函数中提取所有输出变量,并仅选择一个输出。

function value = nth_output(N,fcn,varargin)
  [value{1:N}] = fcn(varargin{:});
  value = value{N};
end

在调用函数时,仅省略多余的输出参数只会给您第一个输出,这就是您的blockproc代码正在做的事情。完成此操作后,就可以创建4个匿名函数来捕获dwt2的每个输出,并运行blockproc 4次。确保为每个匿名函数指定所需的输出,因此14一样,除了输入参数外,您还可以简单地提供要运行的函数的句柄功能。

因此,请尝试以下操作:

I = rgb2gray(imread('pears.png'));
fun1 = @(block_struct) nth_output(1, @dwt2, block_struct.data,'dmey');
fun2 = @(block_struct) nth_output(2, @dwt2, block_struct.data,'dmey');
fun3 = @(block_struct) nth_output(3, @dwt2, block_struct.data,'dmey');
fun4 = @(block_struct) nth_output(4, @dwt2, block_struct.data,'dmey');
I = rgb2gray(I);
cA = blockproc(I,[64 64],fun1);
cH = blockproc(I,[64 64],fun2);
cV = blockproc(I,[64 64],fun3);
cD = blockproc(I,[64 64],fun4);

cAcHcVcD包含每组方向所需的DWT系数。