📄 dcttce.c
字号:
if (QccBitBufferPutBit(output_buffer, 1)) return(1); } return(0);}static int QccWAVdcttceDecodeBitPlaneInfo(QccBitBuffer *input_buffer, int num_subbands, int *max_bits, int max_coefficient_bits){ int subband; int bit_value; max_bits[0] = max_coefficient_bits; for (subband = 1; subband < num_subbands; subband++) { max_bits[subband] = max_coefficient_bits; do { if (QccBitBufferGetBit(input_buffer,&bit_value)) return(1); max_bits[subband]--; } while (bit_value == 0); max_bits[subband]++; } return(0);}int QccWAVdcttceEncodeHeader(QccBitBuffer *output_buffer, int num_levels, int num_rows, int num_cols, double image_mean, double stepsize, int max_coefficient_bits, int overlap_sample, double smooth_factor){ int return_value; if (QccBitBufferPutChar(output_buffer, (unsigned char)num_levels)) { QccErrorAddMessage("(QccWAVdcttceEncodeHeader): Error calling QccBitBufferPuChar()"); goto Error; } if (QccBitBufferPutInt(output_buffer, num_rows)) { QccErrorAddMessage("(QccWAVdcttceEncodeHeader): Error calling QccBitBufferPutInt()"); goto Error; } if (QccBitBufferPutInt(output_buffer, num_cols)) { QccErrorAddMessage("(QccWAVdcttceEncodeHeader): Error calling QccBitBufferPutInt()"); goto Error; } if (QccBitBufferPutDouble(output_buffer, image_mean)) { QccErrorAddMessage("(QccWAVdcttceEncodeHeader): Error calling QccBitBufferPutDouble()"); goto Error; } if (QccBitBufferPutDouble(output_buffer, stepsize)) { QccErrorAddMessage("(QccWAVdcttceEncodeHeader): Error calling QccBitBufferPutDouble()"); goto Error; } if (QccBitBufferPutInt(output_buffer, max_coefficient_bits)) { QccErrorAddMessage("(QccWAVdcttceEncodeHeader): Error calling QccBitBufferPutInt()"); goto Error; } if (QccBitBufferPutInt(output_buffer, overlap_sample)) { QccErrorAddMessage("(QccWAVdcttceEncodeHeader): Error calling QccBitBufferPutInt()"); goto Error; } if (QccBitBufferPutDouble(output_buffer, smooth_factor)) { QccErrorAddMessage("(QccWAVdcttceEncodeHeader): Error calling QccBitBufferPutDouble()"); goto Error; } return_value = 0; goto Return; Error: return_value = 1; Return: return(return_value);}static int QccWAVdcttceRevEst(QccWAVSubbandPyramid *coefficients, char **significance_map, int subband, double *subband_significance, double **p){ int return_value; int subband_origin_row; int subband_origin_col; int subband_num_rows; int subband_num_cols; int row, col; int current_row, current_col; double p1, p3; QccVector p2 = NULL; char *p_char; int v; double filter_coef; double alpha_v, alpha_h; if (subband % 3==1) { //LH horizental more important? alpha_h = QCCWAVTCE_ALPHA_HIGH; alpha_v = QCCWAVTCE_ALPHA_LOW; } else { if (subband % 3==2) { alpha_h = QCCWAVTCE_ALPHA_LOW; alpha_v = QCCWAVTCE_ALPHA_HIGH; } else { alpha_h = QCCWAVTCE_ALPHA; alpha_v = QCCWAVTCE_ALPHA; } } filter_coef = (1 - alpha_h) * (1 - alpha_v) / (2*alpha_h + 2*alpha_v); subband_significance[subband] = 0.0; if (QccWAVSubbandPyramidSubbandSize(coefficients, subband, &subband_num_rows, &subband_num_cols)) { QccErrorAddMessage("(QccWAVdcttceRevEst): Error calling QccWAVSubbandPyramidSubbandSize()"); goto Error; } if (QccWAVSubbandPyramidSubbandOffsets(coefficients, subband, &subband_origin_row, &subband_origin_col)) { QccErrorAddMessage("(QccWAVdcttceRevEst): Error calling QccWAVSubbandPyramidSubbandOffsets()"); goto Error; } if ((p2 = QccVectorAlloc(subband_num_cols)) == NULL) { QccErrorAddMessage("(QccWAVdcttceRevEst): Error calling QccVectorAlloc()"); goto Error; } p1 = QccMathMax(QCCWAVDCTTCE_BOUNDARY_VALUE, ((double)subband_significance[subband]) / (subband_num_rows*subband_num_cols)) * (1 + alpha_h) / (2 * alpha_v + 2 * alpha_h); for (col = 0; col < subband_num_cols; col++) p2[col] = p1; for (row = subband_num_rows - 1; row >= 0; row--) { p1 = p2[0]*(1 - alpha_v)/(1 + alpha_h); current_row = subband_origin_row + row; for (col = subband_num_cols - 1; col >= 0; col--) { current_col = subband_origin_col + col; p_char = &(significance_map[current_row][current_col]); p[current_row][current_col] = alpha_h * p1 + alpha_v*p2[col]; if (*p_char == QCCWAVDCTTCE_S) { p1 = alpha_h * p1 + filter_coef * QCCWAVTCE_REFINE_HOLDER; subband_significance[subband] += QCCWAVTCE_REFINE_HOLDER; } else { v = (*p_char == QCCWAVDCTTCE_S_NEW); p1 = alpha_h * p1 + filter_coef * v; subband_significance[subband] += v; } p2[col] = p1 + alpha_v * p2[col]; } p3 = p2[0]*(1 - alpha_v)/(1 + alpha_h); for (col = 0; col < subband_num_cols; col++) { p_char = &(significance_map[current_row][subband_origin_col + col]); p2[col] = p2[col] + alpha_h * p3; if (*p_char == QCCWAVDCTTCE_S) p3 = alpha_h * p3 + filter_coef * QCCWAVTCE_REFINE_HOLDER; else { v = (*p_char == QCCWAVDCTTCE_S_NEW); p3 = alpha_h * p3 + filter_coef * v; } } } return_value = 0; goto Return; Error: return_value = 1; Return: QccVectorFree(p2); return(return_value);}static int QccWAVUpdateNZNStatus(int subband_origin_row, int subband_origin_col, int subband_num_row, int subband_num_col, int row, int col, char** significance_map, int subband){ //Updata neighbors int current_row, current_col; int shifted_row, shifted_col; current_row = subband_origin_row + row; current_col = subband_origin_col + col; if (row > 0) { shifted_row = current_row - 1; shifted_col = current_col; if (significance_map[shifted_row][shifted_col] < QCCWAVDCTTCE_S) significance_map[shifted_row][shifted_col] = QCCWAVDCTTCE_NZN_NEW; if (col > 0) { shifted_row = current_row - 1; shifted_col = current_col - 1; if (significance_map[shifted_row][shifted_col] < QCCWAVDCTTCE_S) significance_map[shifted_row][shifted_col] = QCCWAVDCTTCE_NZN_NEW; } if (col < subband_num_col - 1) { shifted_row = current_row - 1; shifted_col = current_col + 1; if (significance_map[shifted_row][shifted_col] < QCCWAVDCTTCE_S) significance_map[shifted_row][shifted_col] = QCCWAVDCTTCE_NZN_NEW; } } if (row < subband_num_row - 1) { shifted_row = current_row + 1; shifted_col = current_col; if (significance_map[shifted_row][shifted_col] < QCCWAVDCTTCE_S) significance_map[shifted_row][shifted_col] = QCCWAVDCTTCE_NZN_NEW; if (col > 0) { shifted_row = current_row + 1; shifted_col = current_col - 1; if (significance_map[shifted_row][shifted_col] < QCCWAVDCTTCE_S) significance_map[shifted_row][shifted_col] = QCCWAVDCTTCE_NZN_NEW; } if (col < subband_num_col - 1) { shifted_row = current_row + 1; shifted_col = current_col + 1; if (significance_map[shifted_row][shifted_col] < QCCWAVDCTTCE_S) significance_map[shifted_row][shifted_col] = QCCWAVDCTTCE_NZN_NEW; } } if (col > 0) { shifted_row = current_row; shifted_col = current_col - 1; if (significance_map[shifted_row][shifted_col] < QCCWAVDCTTCE_S) significance_map[shifted_row][shifted_col] = QCCWAVDCTTCE_NZN_NEW; } if (col < subband_num_col - 1) { shifted_row = current_row; shifted_col = current_col + 1; if (significance_map[shifted_row][shifted_col] < QCCWAVDCTTCE_S) significance_map[shifted_row][shifted_col] = QCCWAVDCTTCE_NZN_NEW; } return(0);}static int QccWAVdcttceIPBand(QccWAVSubbandPyramid *coefficients, char **significance_map, char **sign_array, double **p_estimation, double *subband_significance, int subband, double threshold, QccENTArithmeticModel *model, QccBitBuffer *buffer){ int return_value; int subband_origin_row; int subband_origin_col; int subband_num_rows; int subband_num_cols; int row, col; int current_row, current_col; double p1; double p3; double p; double p_forward; double p_parent; QccVector p2 = NULL; int parent_subband; double scale; double parent_density; double child_density; int v; int symbol; double p_lowerbound = 0; double weight[2]; double filter_coef; double increment; char *p_char; double alpha_v, alpha_h; if (subband % 3==1) { //LH horizental more important alpha_h = QCCWAVTCE_ALPHA_HIGH; alpha_v = QCCWAVTCE_ALPHA_LOW; } else { if (subband % 3==2) { alpha_h = QCCWAVTCE_ALPHA_LOW; alpha_v = QCCWAVTCE_ALPHA_HIGH; } else { alpha_h = QCCWAVTCE_ALPHA; alpha_v = QCCWAVTCE_ALPHA; } } // initialization all the constants filter_coef = (1 - alpha_h)*(1 - alpha_v) / (2*alpha_h + 2*alpha_v); weight[0] = (1 - alpha_h) * (1 - alpha_v)/((1 + alpha_h)*(1 + alpha_v)); weight[1] = (2*alpha_h + 2*alpha_v) / ((1 + alpha_h)*(1 + alpha_v)); if (QccWAVSubbandPyramidSubbandSize(coefficients, subband, &subband_num_rows, &subband_num_cols)) { QccErrorAddMessage("(QccWAVdcttceIPBand): Error calling QccWAVSubbandPyramidSubbandSize()"); goto Error; } if (QccWAVSubbandPyramidSubbandOffsets(coefficients, subband, &subband_origin_row, &subband_origin_col)) { QccErrorAddMessage("(QccWAVdcttceIPBand): Error calling QccWAVSubbandPyramidSubbandOffsets()"); goto Error; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -