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 + -
显示快捷键?