dwt.c

来自「QccPack implementation in C」· C语言 代码 · 共 879 行 · 第 1/2 页

C
879
字号
                             int subsample_pattern_row,                             int subsample_pattern_col,                             int num_scales,                             const QccWAVWavelet *wavelet){  int return_value;  int scale;  QccVolume temp_volume = NULL;  int original_num_frames = 0;  int original_num_rows = 0;  int original_num_cols = 0;  int phase_frame;  int phase_row;  int phase_col;    if (input_volume == NULL)    return(0);  if (output_volume == NULL)    return(0);  if (wavelet == NULL)    return(0);    if (num_scales < 0)    return(0);  if (num_scales == 0)    {      QccVolumeCopy(output_volume, input_volume,                    num_frames, num_rows, num_cols);      return(0);    }    original_num_frames = num_frames;  original_num_rows = num_rows;  original_num_cols = num_cols;    if ((temp_volume = QccVolumeAlloc(num_frames, num_rows, num_cols)) == NULL)    {      QccErrorAddMessage("(QccWAVWaveletDyadicDWT3D): Error allocating memory");      goto QccError;    }    if (QccVolumeCopy(temp_volume, input_volume, num_frames, num_rows, num_cols))    {      QccErrorAddMessage("(QccWAVWaveletDyadicDWT3D): Error calling QccVolumeCopy()");      goto QccError;    }    for (scale = 0; scale < num_scales; scale++)    {      phase_frame = QccWAVWaveletDWTSubbandPhase(scale + 1, origin_frame,                                                 subsample_pattern_frame);      phase_row = QccWAVWaveletDWTSubbandPhase(scale + 1, origin_row,                                               subsample_pattern_row);      phase_col = QccWAVWaveletDWTSubbandPhase(scale + 1, origin_col,                                               subsample_pattern_col);            if (QccWAVWaveletAnalysis3D(temp_volume,                                  output_volume,                                  num_frames,                                  num_rows,                                  num_cols,                                  phase_frame,                                  phase_row,                                  phase_col,                                  wavelet))        {          QccErrorAddMessage("(QccWAVWaveletDyadicDWT3D): Error calling QccWAVWaveletAnalysis3D()");          goto QccError;        }            num_frames =        QccWAVWaveletDWTSubbandLength(original_num_frames, scale + 1,                                      0, origin_frame,                                      subsample_pattern_frame);      num_rows =        QccWAVWaveletDWTSubbandLength(original_num_rows, scale + 1,                                      0, origin_row,                                      subsample_pattern_row);      num_cols =        QccWAVWaveletDWTSubbandLength(original_num_cols, scale + 1,                                      0, origin_col,                                      subsample_pattern_col);            if (QccVolumeCopy(temp_volume, output_volume,                        num_frames, num_rows, num_cols))        {          QccErrorAddMessage("(QccWAVWaveletDyadicDWT3D): Error calling QccVolumeCopy()");          goto QccError;        }    }    return_value = 0;  goto QccReturn; QccError:  return_value = 1; QccReturn:  QccVolumeFree(temp_volume, original_num_frames, original_num_rows);  return(return_value);}int QccWAVWaveletInverseDyadicDWT3D(const QccVolume input_volume,                                    QccVolume output_volume,                                    int num_frames,                                    int num_rows,                                    int num_cols,                                    int origin_frame,                                    int origin_row,                                    int origin_col,                                    int subsample_pattern_frame,                                    int subsample_pattern_row,                                    int subsample_pattern_col,                                    int num_scales,                                    const QccWAVWavelet *wavelet){  int return_value;  int scale;  QccVolume temp_volume = NULL;  int original_num_frames = 0;  int original_num_rows = 0;  int original_num_cols = 0;  int phase_frame;  int phase_row;  int phase_col;    if (input_volume == NULL)    return(0);  if (output_volume == NULL)    return(0);  if (wavelet == NULL)    return(0);    if (num_scales < 0)    return(0);  if (num_scales == 0)    {      QccVolumeCopy(output_volume, input_volume,                    num_frames, num_rows, num_cols);      return(0);    }    original_num_frames = num_frames;  original_num_rows = num_rows;  original_num_cols = num_cols;    if ((temp_volume = QccVolumeAlloc(num_frames, num_rows, num_cols)) == NULL)    {      QccErrorAddMessage("(QccWAVWaveletInverseDyadicDWT3D): Error allocating memory");      goto QccError;    }    if (QccVolumeCopy(temp_volume, input_volume, num_frames, num_rows, num_cols))    {      QccErrorAddMessage("(QccWAVWaveletInverseDyadicDWT3D): Error calling QccVolumeCopy()");      goto QccError;    }    for (scale = num_scales - 1; scale >= 0; scale--)    {      num_frames =        QccWAVWaveletDWTSubbandLength(original_num_frames, scale,                                      0, origin_frame,                                      subsample_pattern_frame);      num_rows =        QccWAVWaveletDWTSubbandLength(original_num_rows, scale,                                      0, origin_row,                                      subsample_pattern_row);      num_cols =        QccWAVWaveletDWTSubbandLength(original_num_cols, scale,                                      0, origin_col,                                      subsample_pattern_col);            phase_frame = QccWAVWaveletDWTSubbandPhase(scale + 1, origin_frame,                                                 subsample_pattern_frame);      phase_row = QccWAVWaveletDWTSubbandPhase(scale + 1, origin_row,                                               subsample_pattern_row);      phase_col = QccWAVWaveletDWTSubbandPhase(scale + 1, origin_col,                                               subsample_pattern_col);      if (QccWAVWaveletSynthesis3D(temp_volume,                                   output_volume,                                   num_frames,                                   num_rows,                                   num_cols,                                   phase_frame,                                   phase_row,                                   phase_col,                                   wavelet))        {          QccErrorAddMessage("(QccWAVWaveletInverseDyadicDWT3D): Error calling QccWAVWaveletSynthesis3D()");          goto QccError;        }            if (QccVolumeCopy(temp_volume, output_volume,                        num_frames, num_rows, num_cols))        {          QccErrorAddMessage("(QccWAVWaveletInverseDyadicDWT3D): Error calling QccVolumeCopy()");          goto QccError;        }    }    return_value = 0;  goto QccReturn; QccError:  return_value = 1; QccReturn:  QccVolumeFree(temp_volume, original_num_frames, original_num_rows);  return(return_value);}int QccWAVWaveletPacketDWT3D(const QccVolume input_volume,                             QccVolume output_volume,                             int num_frames,                             int num_rows,                             int num_cols,                             int origin_frame,                             int origin_row,                             int origin_col,                             int subsample_pattern_frame,                             int subsample_pattern_row,                             int subsample_pattern_col,                             int temporal_num_scales,                             int spatial_num_scales,                             const QccWAVWavelet *wavelet){  int return_value;  int frame, row, col;  QccMatrix temp_matrix = NULL;  QccVector input_z = NULL;  QccVector output_z = NULL;    if (input_volume == NULL)    return(0);  if (output_volume == NULL)    return(0);  if (wavelet == NULL)    return(0);    if ((temporal_num_scales < 0) ||      (spatial_num_scales < 0))    return(0);  if ((temporal_num_scales == 0) &&      (spatial_num_scales == 0))    {      QccVolumeCopy(output_volume, input_volume,                    num_frames, num_rows, num_cols);      return(0);    }    if ((temp_matrix = QccMatrixAlloc(num_rows, num_cols)) == NULL)    {      QccErrorAddMessage("(QccWAVWaveletPacketDWT3D): Error calling QccMatrixAlloc()");      goto QccError;    }    if ((input_z = QccVectorAlloc(num_frames)) == NULL)    {      QccErrorAddMessage("(QccWAVWaveletPacketDWT3D): Error calling QccVectorAlloc()");      goto QccError;    }    if ((output_z = QccVectorAlloc(num_frames)) == NULL)    {      QccErrorAddMessage("(QccWAVWaveletPacketDWT3D): Error calling QccVectorAlloc()");      goto QccError;    }    for (row = 0; row < num_rows; row++)    for (col = 0; col < num_cols; col++)      {        for (frame = 0; frame < num_frames; frame++)          input_z[frame] = input_volume[frame][row][col];                if (QccWAVWaveletDWT1D(input_z,                               output_z,                               num_frames,                               origin_frame,                               subsample_pattern_frame,                               temporal_num_scales,                               wavelet))          {            QccErrorAddMessage("(QccWAVWaveletPacketDWT3D): Error calling QccWAVWaveletDWT1D()");            goto QccError;          }                for (frame = 0; frame < num_frames; frame++)          output_volume[frame][row][col] = output_z[frame];      }    for (frame = 0; frame < num_frames; frame++)    {      if (QccWAVWaveletDWT2D(output_volume[frame],                             temp_matrix,                             num_rows,                             num_cols,                             origin_row,                             origin_col,                             subsample_pattern_row,                             subsample_pattern_col,                             spatial_num_scales,                             wavelet))        {          QccErrorAddMessage("(QccWAVWaveletPacketDWT3D): Error calling QccWAVWaveletDWT2D()");          goto QccError;        }            if (QccMatrixCopy(output_volume[frame], temp_matrix, num_rows, num_cols))        {          QccErrorAddMessage("(QccWAVWaveletPacketDWT3D): Error calling QccMatrixCopy()");          goto QccError;        }    }    return_value = 0;  goto QccReturn; QccError:  return_value = 1; QccReturn:  QccMatrixFree(temp_matrix, num_rows);  QccVectorFree(input_z);  QccVectorFree(output_z);  return(return_value);}int QccWAVWaveletInversePacketDWT3D(const QccVolume input_volume,                                    QccVolume output_volume,                                    int num_frames,                                    int num_rows,                                    int num_cols,                                    int origin_frame,                                    int origin_row,                                    int origin_col,                                    int subsample_pattern_frame,                                    int subsample_pattern_row,                                    int subsample_pattern_col,                                    int temporal_num_scales,                                    int spatial_num_scales,                                    const QccWAVWavelet *wavelet){  int return_value;  int frame, row, col;  QccMatrix temp_matrix = NULL;  QccVector input_z = NULL;  QccVector output_z = NULL;    if (input_volume == NULL)    return(0);  if (output_volume == NULL)    return(0);  if (wavelet == NULL)    return(0);    if ((temporal_num_scales < 0) ||      (spatial_num_scales < 0))    return(0);  if ((temporal_num_scales == 0) &&      (spatial_num_scales == 0))    {      QccVolumeCopy(output_volume, input_volume,                    num_frames, num_rows, num_cols);      return(0);    }    if ((temp_matrix = QccMatrixAlloc(num_rows, num_cols)) == NULL)    {      QccErrorAddMessage("(QccWAVWaveletInversePacketDWT3D): Error calling QccMatrixAlloc()");      goto QccError;    }    if ((input_z = QccVectorAlloc(num_frames)) == NULL)    {      QccErrorAddMessage("(QccWAVWaveletInversePacketDWT3D): Error calling QccVectorAlloc()");      goto QccError;    }    if ((output_z = QccVectorAlloc(num_frames)) == NULL)    {      QccErrorAddMessage("(QccWAVWaveletInversePacketDWT3D): Error calling QccVectorAlloc()");      goto QccError;    }    for (frame = 0; frame < num_frames; frame++)    {      if (QccWAVWaveletInverseDWT2D(input_volume[frame],                                    temp_matrix,                                    num_rows,                                    num_cols,                                    origin_row,                                    origin_col,                                    subsample_pattern_row,                                    subsample_pattern_col,                                    spatial_num_scales,                                    wavelet))        {          QccErrorAddMessage("(QccWAVWaveletInversePacketDWT3D): Error calling QccWAVWaveletInverseDWT2D()");          goto QccError;        }      if (QccMatrixCopy(output_volume[frame], temp_matrix, num_rows, num_cols))        {          QccErrorAddMessage("(QccWAVWaveletInversePacketDWT3D): Error calling QccMatrixCopy()");          goto QccError;        }    }    for (row = 0; row < num_rows; row++)    for (col = 0; col < num_cols; col++)      {        for (frame = 0; frame < num_frames; frame++)          input_z[frame] = output_volume[frame][row][col];                if (QccWAVWaveletInverseDWT1D(input_z,                                      output_z,                                      num_frames,                                       origin_frame,                                      subsample_pattern_frame,                                      temporal_num_scales,                                      wavelet))          {            QccErrorAddMessage("(QccWAVWaveletInversePacketDWT3D): Error calling QccWAVWaveletInverseDWT1D()");            goto QccError;          }                for (frame = 0; frame < num_frames; frame++)          output_volume[frame][row][col] = output_z[frame];      }    return_value = 0;  goto QccReturn; QccError:  return_value = 1; QccReturn:  QccMatrixFree(temp_matrix, num_rows);  QccVectorFree(input_z);  QccVectorFree(output_z);  return(return_value);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?