繁体   English   中英

将图像分成不重叠的块并在每个块上应用 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 图像。

我想参考这篇关于如何在给定输入函数的情况下选择第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 系数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM