将图像分成不重叠的块并在每个块上应用 2D DWT

Divide an image into non-overlapping blocks and applying the 2D DWT on each block

我正在开发一个图像拼接检测软件,所以我需要将图像分成不重叠的块,并对图像的每个块应用离散迈耶小波变换

我已尝试使用 blockproc 函数来执行此操作,但没有得到任何结果:

I = imread('pears.png');

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

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

那么如何使用上面的代码访问 dwt2[cA,cH,cV,cD]?

blockproc 假定您正在输出实际图像。您不能将其用于多个输出。如果您真的希望它与 blockproc 一起使用,您将不幸地需要调用 blockproc 四次,每次都为方向提取不同的系数集。另请注意,2D DWT 仅适用于 灰度 图像,因此您需要在实际进行任何处理之前转换为灰度。您选择的梨图像是彩色/RGB图像。

我想参考此 post 关于如何 select 给定输入函数 Nth 输出:How do I get the second return value from a function without using temporary variables?。您需要将此代码保存到名为 nth_output.m 的文件中,该文件允许您以编程方式从函数中提取所有输出变量并仅选择一个输出。

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

在调用函数时简单地省略额外的输出参数只会给你第一个输出,这就是你的 blockproc 代码正在做的事情。一旦你这样做了,就需要创建 4 个匿名函数来捕获 dwt2 和 运行ning 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 系数。