📄 subband_pyramid3d_int.c
字号:
return(1); } if (QccWAVSubbandPyramid3DIntReadHeader(infile, subband_pyramid)) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntRead): Error calling QccWAVSubbandPyramid3DIntReadHeader()"); return(1); } if (QccWAVSubbandPyramid3DIntAlloc(subband_pyramid)) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntRead): Error calling QccIMGSubbandPyramidAlloc()"); return(1); } for (frame = 0; frame < subband_pyramid->num_frames; frame++) for (row = 0; row < subband_pyramid->num_rows; row++) for (col = 0; col < subband_pyramid->num_cols; col++) if (QccFileReadInt(infile, &(subband_pyramid->volume[frame][row][col]))) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntRead): Error calling QccFileReadInt()", subband_pyramid->filename); return(1); } QccFileClose(infile); return(0);}static int QccWAVSubbandPyramid3DIntWriteHeader(FILE *outfile, const QccWAVSubbandPyramid3DInt *subband_pyramid){ if ((outfile == NULL) || (subband_pyramid == NULL)) return(0); if (QccFileWriteMagicNumber(outfile, QCCWAVSUBBANDPYRAMID3DINT_MAGICNUM)) goto Error; fprintf(outfile, "%d\n", subband_pyramid->transform_type); if (ferror(outfile)) goto Error; switch (subband_pyramid->transform_type) { case QCCWAVSUBBANDPYRAMID3DINT_DYADIC: fprintf(outfile, "%d\n", subband_pyramid->spatial_num_levels); if (ferror(outfile)) goto Error; break; case QCCWAVSUBBANDPYRAMID3DINT_PACKET: fprintf(outfile, "%d %d\n", subband_pyramid->temporal_num_levels, subband_pyramid->spatial_num_levels); if (ferror(outfile)) goto Error; break; default: QccErrorAddMessage("(QccWAVSubbandPyramid3DIntWriteHeader): Unrecognized transform type"); goto Error; } fprintf(outfile, "%d %d %d\n", subband_pyramid->num_cols, subband_pyramid->num_rows, subband_pyramid->num_frames); if (ferror(outfile)) goto Error; return(0); Error: QccErrorAddMessage("(QccWAVSubbandPyramid3DIntWriteHeader): Error writing header to %s", subband_pyramid->filename); return(1);}int QccWAVSubbandPyramid3DIntWrite(const QccWAVSubbandPyramid3DInt *subband_pyramid){ FILE *outfile; int frame, row, col; if (subband_pyramid == NULL) return(0); if ((outfile = QccFileOpen(subband_pyramid->filename, "w")) == NULL) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntWrite): Error calling QccFileOpen()"); return(1); } if (QccWAVSubbandPyramid3DIntWriteHeader(outfile, subband_pyramid)) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntWrite): Error calling QccWAVSubbandPyramid3DIntWriteHeader()"); return(1); } for (frame = 0; frame < subband_pyramid->num_frames; frame++) for (row = 0; row < subband_pyramid->num_rows; row++) for (col = 0; col < subband_pyramid->num_cols; col++) if (QccFileWriteInt(outfile, subband_pyramid->volume[frame][row][col])) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntWrite): Error calling QccFileWriteInt()"); return(1); } QccFileClose(outfile); return(0);}int QccWAVSubbandPyramid3DIntCopy(QccWAVSubbandPyramid3DInt *subband_pyramid1, const QccWAVSubbandPyramid3DInt *subband_pyramid2){ if (subband_pyramid1 == NULL) return(0); if (subband_pyramid2 == NULL) return(0); if ((subband_pyramid1->num_rows != subband_pyramid2->num_rows) || (subband_pyramid1->num_cols != subband_pyramid2->num_cols) || (subband_pyramid1->num_frames != subband_pyramid2->num_frames)) { QccWAVSubbandPyramid3DIntFree(subband_pyramid1); subband_pyramid1->num_frames = subband_pyramid2->num_frames; subband_pyramid1->num_rows = subband_pyramid2->num_rows; subband_pyramid1->num_cols = subband_pyramid2->num_cols; if (QccWAVSubbandPyramid3DIntAlloc(subband_pyramid1)) { QccErrorAddMessage("(QccWAVSubbandPyramidd3DCopy): Error calling QccWAVSubbandPyramid3DIntAlloc()"); return(1); } } subband_pyramid1->transform_type = subband_pyramid2->transform_type; subband_pyramid1->spatial_num_levels = subband_pyramid2->spatial_num_levels; subband_pyramid1->temporal_num_levels = subband_pyramid2->temporal_num_levels; subband_pyramid1->origin_frame = subband_pyramid2->origin_frame; subband_pyramid1->origin_row = subband_pyramid2->origin_row; subband_pyramid1->origin_col = subband_pyramid2->origin_col; subband_pyramid1->subsample_pattern_frame = subband_pyramid2->subsample_pattern_frame; subband_pyramid1->subsample_pattern_row = subband_pyramid2->subsample_pattern_row; subband_pyramid1->subsample_pattern_col = subband_pyramid2->subsample_pattern_col; if (QccVolumeIntCopy(subband_pyramid1->volume, subband_pyramid2->volume, subband_pyramid1->num_frames, subband_pyramid1->num_rows, subband_pyramid1->num_cols)) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntCopy): Error calling QccVolumeIntCopy()"); return(1); } return(0);}int QccWAVSubbandPyramid3DIntZeroSubband(QccWAVSubbandPyramid3DInt *subband_pyramid, int subband){ int num_subbands; int subband_num_frames; int subband_num_rows; int subband_num_cols; int subband_frame; int subband_row; int subband_col; int frame, row, col; int spatial_num_levels = subband_pyramid->spatial_num_levels; int temporal_num_levels = subband_pyramid->temporal_num_levels; if (subband_pyramid == NULL) return(0); if (subband_pyramid->volume == NULL) return(0); if (subband < 0) return(0); switch (subband_pyramid->transform_type) { case QCCWAVSUBBANDPYRAMID3DINT_DYADIC: num_subbands = QccWAVSubbandPyramid3DIntNumLevelsToNumSubbandsDyadic(spatial_num_levels); break; case QCCWAVSUBBANDPYRAMID3DINT_PACKET: num_subbands = QccWAVSubbandPyramid3DIntNumLevelsToNumSubbandsPacket(spatial_num_levels, temporal_num_levels); break; default: QccErrorAddMessage("(QccWAVSubbandPyramid3DIntZeroSubband): Unrecognized transform type"); return(1); } if (subband > num_subbands) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntZeroSubband): specified subband is large for given subband pyramid"); return(1); } if (QccWAVSubbandPyramid3DIntSubbandSize(subband_pyramid, subband, &subband_num_frames, &subband_num_rows, &subband_num_cols)) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntZeroSubband): Error calling QccWAVSubbandPyramid3DIntSubbandSize()"); return(1); } if (QccWAVSubbandPyramid3DIntSubbandOffsets(subband_pyramid, subband, &subband_frame, &subband_row, &subband_col)) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntZeroSubband): Error calling QccWAVSubbandPyramid3DIntSubbandOffsets()"); return(1); } for (frame = subband_frame; frame < subband_frame + subband_num_frames; frame++) for (row = subband_row; row < subband_row + subband_num_rows; row++) for (col = subband_col; col < subband_col + subband_num_cols; col++) subband_pyramid->volume[frame][row][col] = 0; return(0);}int QccWAVSubbandPyramid3DIntSubtractMean(QccWAVSubbandPyramid3DInt *subband_pyramid, int *mean){ int subband_frame, subband_row, subband_col; int subband_num_frames, subband_num_rows, subband_num_cols; int mean1; if (subband_pyramid == NULL) return(0); if (subband_pyramid->volume == NULL) return(0); if (QccWAVSubbandPyramid3DIntSubbandSize(subband_pyramid, 0, &subband_num_frames, &subband_num_rows, &subband_num_cols)) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntSubtractMean): Error calling QccWAVSubbandPyramid3DIntSubbandSize()"); return(1); } mean1 = (int)rint(QccVolumeIntMean(subband_pyramid->volume, subband_num_frames, subband_num_rows, subband_num_cols)); for (subband_frame = 0; subband_frame < subband_num_frames; subband_frame++) for (subband_row = 0; subband_row < subband_num_rows; subband_row++) for (subband_col = 0; subband_col < subband_num_cols; subband_col++) subband_pyramid->volume[subband_frame][subband_row][subband_col] -= mean1; if (mean != NULL) *mean = mean1; return(0);}int QccWAVSubbandPyramid3DIntAddMean(QccWAVSubbandPyramid3DInt *subband_pyramid, int mean){ int subband_frame, subband_row, subband_col; int subband_num_frames, subband_num_rows, subband_num_cols; if (subband_pyramid == NULL) return(0); if (subband_pyramid->volume == NULL) return(0); if (subband_pyramid->spatial_num_levels || subband_pyramid->temporal_num_levels) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntAddMean): Subband-pyramid number of levels is not zero"); return(1); } if (QccWAVSubbandPyramid3DIntSubbandSize(subband_pyramid, 0, &subband_num_frames, &subband_num_rows, &subband_num_cols)) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntAddMean): Error calling QccWAVSubbandPyramid3DIntSubbandSize()"); return(1); } for (subband_frame = 0; subband_frame < subband_num_frames; subband_frame++) for (subband_row = 0; subband_row < subband_num_rows; subband_row++) for (subband_col = 0; subband_col < subband_num_cols; subband_col++) subband_pyramid->volume[subband_frame][subband_row][subband_col] += mean; return(0);}int QccWAVSubbandPyramid3DIntDWT(QccWAVSubbandPyramid3DInt *subband_pyramid, int transform_type, int temporal_num_levels, int spatial_num_levels, const QccWAVWavelet *wavelet){ int return_value; if (subband_pyramid == NULL) return(0); if (wavelet == NULL) return(0); if (subband_pyramid->spatial_num_levels || subband_pyramid->temporal_num_levels) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntDWT): Subband pyramid is already decomposed"); goto Error; } switch (transform_type) { case QCCWAVSUBBANDPYRAMID3DINT_DYADIC: subband_pyramid->transform_type = QCCWAVSUBBANDPYRAMID3DINT_DYADIC; if (spatial_num_levels != temporal_num_levels) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntDWT): Spatial and temporal number of levels must be identical for a dyadic transform"); goto Error; } subband_pyramid->spatial_num_levels = subband_pyramid->temporal_num_levels = spatial_num_levels; if (QccWAVWaveletDyadicDWT3DInt(subband_pyramid->volume, subband_pyramid->num_frames, subband_pyramid->num_rows, subband_pyramid->num_cols, subband_pyramid->origin_frame, subband_pyramid->origin_row, subband_pyramid->origin_col, subband_pyramid->subsample_pattern_frame, subband_pyramid->subsample_pattern_row, subband_pyramid->subsample_pattern_col, spatial_num_levels, wavelet)) { QccErrorAddMessage("(QccWAVSubbandPyramid3DIntDWT): Error calling QccWAVWaveletDyadicDWT3DInt()"); goto Error; } break; case QCCWAVSUBBANDPYRAMID3DINT_PACKET: subband_pyramid->transform_type = QCCWAVSUBBANDPYRAMID3DINT_PACKET; subband_pyramid->spatial_num_levels = spatial_num_levels; subband_pyramid->temporal_num_levels = temporal_num_levels; if (QccWAVWaveletPacketDWT3DInt(subband_pyramid->volume, subband_pyramid->num_frames, subband_pyramid->num_rows, subband_pyramid->num_cols,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -