Пример #1
0
void setHistogram(double *src, int *hist, int width, int height) {
	InitHistogram(hist);
	for (int j = 0;j<height;j++)
		for (int i = 0;i<width;i++) {
			int tempv = src[j*width + i];
			hist[tempv]++;
		}
}
Пример #2
0
static int MBAnalyzeBestIntra4Mode(VP8EncIterator* const it,
                                   int best_alpha) {
  uint8_t modes[16];
  const int max_mode = MAX_INTRA4_MODE;
  int i4_alpha;
  VP8Histogram total_histo;
  int cur_histo = 0;
  InitHistogram(&total_histo);

  VP8IteratorStartI4(it);
  do {
    int mode;
    int best_mode_alpha = DEFAULT_ALPHA;
    VP8Histogram histos[2];
    const uint8_t* const src = it->yuv_in_ + Y_OFF + VP8Scan[it->i4_];

    VP8MakeIntra4Preds(it);
    for (mode = 0; mode < max_mode; ++mode) {
      int alpha;

      InitHistogram(&histos[cur_histo]);
      VP8CollectHistogram(src, it->yuv_p_ + VP8I4ModeOffsets[mode],
                          0, 1, &histos[cur_histo]);
      alpha = GetAlpha(&histos[cur_histo]);
      if (IS_BETTER_ALPHA(alpha, best_mode_alpha)) {
        best_mode_alpha = alpha;
        modes[it->i4_] = mode;
        cur_histo ^= 1;   // keep track of best histo so far.
      }
    }
    // accumulate best histogram
    MergeHistograms(&histos[cur_histo ^ 1], &total_histo);
    // Note: we reuse the original samples for predictors
  } while (VP8IteratorRotateI4(it, it->yuv_in_ + Y_OFF));

  i4_alpha = GetAlpha(&total_histo);
  if (IS_BETTER_ALPHA(i4_alpha, best_alpha)) {
    VP8SetIntra4Mode(it, modes);
    best_alpha = i4_alpha;
  }
  return best_alpha;
}
Пример #3
0
//均衡直方图,将原图直方图,经过公式得到目标直方图
void EqualizationHist(int *src_hist, double *dst_map) {
	int temphist[GRAY_LEVEL];
	InitHistogram(temphist);
	int max = findHistogramMax(src_hist);
	int min = findHistogramMin(src_hist);
	temphist[min] = src_hist[min];
	for (int i = min + 1;i <= max;i++)
		temphist[i] = temphist[i - 1] + src_hist[i];
	for (int i = min;i <= max;i++)
		temphist[i] -= temphist[min];
	int total = temphist[max];
	for (int i = min;i <= max;i++) {
		dst_map[i] = ((double)GRAY_LEVEL - 1.0)*temphist[i] / total;
	}

}
Пример #4
0
/******************************
直方图归一化
******************************/
void HistogramSpecification(double *src, double *dst, int* hist, int width, int height) {
	int src_hist[GRAY_LEVEL];
	setHistogram(src, src_hist, width, height);
	double srcMap[GRAY_LEVEL];
	double histMap[GRAY_LEVEL];
	InitMappingTable(srcMap, GRAY_LEVEL, TABLE_DOUBLE);
	EqualizationHist(src_hist, srcMap);
	EqualizationHist(hist, histMap);
	int histMap_[GRAY_LEVEL];
	InitHistogram(histMap_);
	for (int i = 0;i<GRAY_LEVEL;i++)
		histMap_[(int)histMap[i]] = i;
	double dstMap[GRAY_LEVEL];
	for (int i = 0;i<GRAY_LEVEL;i++) {
		dstMap[i] = histMap_[(int)srcMap[i]];
	}

	fillMaptable(dstMap);
	for (int i = 0;i<width;i++)
		for (int j = 0;j<height;j++)
			dst[j*width + i] = dstMap[(int)src[j*width + i]];
}
Пример #5
0
static int MBAnalyzeBestUVMode(VP8EncIterator* const it) {
  int best_alpha = DEFAULT_ALPHA;
  int best_mode = 0;
  const int max_mode = MAX_UV_MODE;
  int mode;

  VP8MakeChroma8Preds(it);
  for (mode = 0; mode < max_mode; ++mode) {
    VP8Histogram histo;
    int alpha;
    InitHistogram(&histo);
    VP8CollectHistogram(it->yuv_in_ + U_OFF,
                        it->yuv_p_ + VP8UVModeOffsets[mode],
                        16, 16 + 4 + 4, &histo);
    alpha = GetAlpha(&histo);
    if (IS_BETTER_ALPHA(alpha, best_alpha)) {
      best_alpha = alpha;
      best_mode = mode;
    }
  }
  VP8SetIntraUVMode(it, best_mode);
  return best_alpha;
}
Пример #6
0
static int MBAnalyzeBestIntra16Mode(VP8EncIterator* const it) {
  const int max_mode = MAX_INTRA16_MODE;
  int mode;
  int best_alpha = DEFAULT_ALPHA;
  int best_mode = 0;

  VP8MakeLuma16Preds(it);
  for (mode = 0; mode < max_mode; ++mode) {
    VP8Histogram histo;
    int alpha;

    InitHistogram(&histo);
    VP8CollectHistogram(it->yuv_in_ + Y_OFF,
                        it->yuv_p_ + VP8I16ModeOffsets[mode],
                        0, 16, &histo);
    alpha = GetAlpha(&histo);
    if (IS_BETTER_ALPHA(alpha, best_alpha)) {
      best_alpha = alpha;
      best_mode = mode;
    }
  }
  VP8SetIntra16Mode(it, best_mode);
  return best_alpha;
}