Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 逆双正交2.2小波逆DWT实现_C_Matlab_Wavelet_Wavelet Transform - Fatal编程技术网

C 逆双正交2.2小波逆DWT实现

C 逆双正交2.2小波逆DWT实现,c,matlab,wavelet,wavelet-transform,C,Matlab,Wavelet,Wavelet Transform,我有一些图像数据,据说是用MATLAB的5/3勒格尔整数提升小波变换进行变换的。执行反向DWT的实际Matlab代码调用以下函数: liftwave('rbio2.2') 它将4个128x128矩阵(LL、HL、LH、HH)和小波(称为提升方案中的LS)作为输入,并返回252x252像素的图像。我不知道在进行逆DWT之前是否添加了任何填充,也不知道生成的图像大小对于这种类型的小波是否正常 我正在寻找一个特定的小波逆变换DWT在Matlab之外的实现。我尝试过pywavelet,但得到的图像不同

我有一些图像数据,据说是用MATLAB的5/3勒格尔整数提升小波变换进行变换的。执行反向DWT的实际Matlab代码调用以下函数:

liftwave('rbio2.2')
它将4个128x128矩阵(LL、HL、LH、HH)和小波(称为提升方案中的LS)作为输入,并返回252x252像素的图像。我不知道在进行逆DWT之前是否添加了任何填充,也不知道生成的图像大小对于这种类型的小波是否正常

我正在寻找一个特定的小波逆变换DWT在Matlab之外的实现。我尝试过pywavelet,但得到的图像不同(错误)

有人能推荐一个开源实现吗

更新

我发现(其中一个)具有整数到整数映射的小波:

void dwt_cdf53_i_ex_stride_i(
    const int *src_l,
    const int *src_h,
    int *dst,
    int *tmp,
    int N,
    int stride)
{
    assert( N >= 0 && NULL != src_l && NULL != src_h && NULL != dst && NULL != tmp && 0 != stride );

    // fix for small N
    if(N < 2)
        return;

    // copy src into tmp
    dwt_util_memcpy_stride_i(tmp+0, 2*sizeof(int), src_l, stride,  ceil_div2(N));
    dwt_util_memcpy_stride_i(tmp+1, 2*sizeof(int), src_h, stride, floor_div2(N));

    // backward update 1 + backward predict 1
    for(int i=2; i<N-(N&1); i+=2)
        tmp[i] -= ( (tmp[i-1] + tmp[i+1]) + 2 ) >> 2;

    tmp[0] -= (tmp[1] + 1) >> 1;

    if(is_odd(N))
        tmp[N-1] -= (tmp[N-2] + 1) >> 1;
    else
        tmp[N-1] += tmp[N-2];

    for(int i=1; i<N-2+(N&1); i+=2)
        tmp[i] += ( tmp[i-1] + tmp[i+1] ) >> 1;

    // copy tmp into dst
    dwt_util_memcpy_stride_i(dst, stride, tmp, sizeof(int), N);
}
void dwt\u cdf53\u i\u ex\u stride\u i(
常数int*src_l,
常数int*src_h,
int*dst,
int*tmp,
int N,
int(步幅)
{
断言(N>=0&&NULL!=src_l&&NULL!=src_h&&NULL!=dst&&NULL!=tmp&&0!=stride);
//小N的修复
if(N<2)
返回;
//将src复制到tmp中
dwt_util_memcpy_stride_i(tmp+0,2*sizeof(int),src_l,stride,celi_div2(N));
dwt_util_memcpy_stride_i(tmp+1,2*sizeof(int),src_h,stride,floor_div2(N));
//向后更新1+向后预测1
对于(int i=2;i>2;
tmp[0]-=(tmp[1]+1)>>1;
if(是奇数(N))
tmp[N-1]-=(tmp[N-2]+1)>>1;
其他的
tmp[N-1]+=tmp[N-2];
对于(int i=1;i>1;
//将tmp复制到dst中
dwt_util_memcpy_stride_i(dst、stride、tmp、sizeof(int)、N);
}

如何将其更改为执行反向双正交小波?

反向双正交样条小波逆变换(rbio2.2)与反向双正交小波正向变换(bior2.2)相同。从我的头顶看,反向小波整数到整数逆变换的代码如下所示:

void dwt\u rcdf53\u i\u ex\u stride\u i(
常数int*src_l,
常数int*src_h,
int*dst,
int*tmp,
int N,
int(步幅)
{
断言(N>=0&&NULL!=src_l&&NULL!=src_h&&NULL!=dst&&NULL!=tmp&&0!=stride);
//小N的修复
if(N<2)
返回;
//将src复制到tmp中
dwt_util_memcpy_stride_i(tmp+0,2*sizeof(int),src_l,stride,celi_div2(N));
dwt_util_memcpy_stride_i(tmp+1,2*sizeof(int),src_h,stride,floor_div2(N));
//预测1+更新1
对于(int i=1;i>1;
if(是奇数(N))
tmp[N-1]+=(tmp[N-2]+1)>>1;
其他的
tmp[N-1]-=tmp[N-2];
tmp[0]+=(tmp[1]+1)>>1;
对于(int i=2;i>2;
//将tmp复制到dst中
dwt_util_memcpy_stride_i(dst、stride、tmp、sizeof(int)、N);
}

我们会考虑为书籍、工具、软件库以及更多有关StackOverflow的内容寻求建议的问题。这些问题可以在SE网站上回答。@rahnema1我重新表述了我的问题,询问如何修改特定的代码片段,使其执行rbio2.2反向DWT而不是bior2.2。这就是我得到的答案这是我从你的代码中得到的,你认为我是错的吗,图像实际上是用bior2.2而不是rbio2.2转换的?我的问题是,我看到了一些原始Matlab代码没有的工件。很难说。一般来说,libdwt库与Matlab不兼容L和H系数的位置可能不同。内存布局也可能不同。您应该使用相同的库分解并合成图像。您可以尝试以下操作:
/*predict*/for(int i=2;i>1;
/*update*/for(int i=1;i>2;
),但我不确定这是否是问题所在。