Image 将图像分割为不重叠的块,并在每个块上应用2D DWT

Image 将图像分割为不重叠的块,并在每个块上应用2D DWT,image,matlab,image-processing,dwt,Image,Matlab,Image Processing,Dwt,我正在创建一个图像拼接检测软件,所以我需要将图像分割成不重叠的blocsk,并在图像的每个块上应用离散Meyer小波变换 我已尝试使用blockproc函数执行此操作,但没有得到任何结果: I = imread('pears.png'); fun = @(block_struct)... dwt2(block_struct.data,'dmey'); C = blockproc(I,[64 64],fun); 那么,如何使用上述代码访问dwt2的[cA、cH、cV、cD]呢?假设您

我正在创建一个图像拼接检测软件,所以我需要将图像分割成不重叠的blocsk,并在图像的每个块上应用离散Meyer小波变换

我已尝试使用
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
四次,每次都提取不同方向的系数集。还请注意,2D DWT仅适用于灰度图像,因此您需要在实际执行任何处理之前转换为灰度。您选择的梨图像是彩色/RGB图像

我想参考这篇文章,了解如何在给定输入函数的情况下选择
N
th输出:。您需要将此代码保存到名为
nth\u output.m
的文件中,该文件允许您通过编程从函数中提取所有输出变量,并仅选择一个输出

function value = nth_output(N,fcn,varargin)
  [value{1:N}] = fcn(varargin{:});
  value = value{N};
end
调用函数时,只需省略额外的输出参数,即可获得第一个输出,这就是
blockproc
代码所做的。一旦这样做,就需要创建4个匿名函数来捕获
dwt2
的每个输出,并运行
blockproc
4次。确保为每个匿名函数指定所需的输出,以便
1
最多
4
,并且您只需为要运行的函数提供一个句柄,以及进入该函数的输入参数

因此,请尝试以下方法:

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);

cA
cH
cV
cD
包含每组方向所需的DWT系数。

因此我需要应用两级DWT,我将代码编写为cA2=blockproc(cA[64],fun1);cH2=blockproc(cH[64],fun2);cV2=blockproc(cV[64],fun3);cD2=blockproc(cD[64],fun4);如果这是真的,我可以将两个级别的所有8个子带四舍五入到最近的整数并取其绝对值吗value@MohammedKassem是的,对于2级分解,您必须重复该过程。“我不确定你们最后一次评论的绝对值是什么意思。”穆罕默德·卡西姆:我回答你们的问题了吗?