OpenCv求直方图及直方图均衡化

来源:互联网 发布:gre考试内容 知乎 编辑:程序博客网 时间:2024/04/29 00:47

procedure TFrmMain.BtnHistogramClick(Sender: TObject);
var
  pHist: PCvHistogram;
  sFileName: string;
  pImg, pHistImg: PIplImage;
  nHistogramBins: Integer;
  HistogramRange1: array[0..1] of Single;
  pHistogramRange: PFloat;
  i: Integer;
  hist_size: array[0..1] of Integer;
  dMaxHist: Float;
begin
  if OpenDialog1.Execute then
    sFileName := OpenDialog1.FileName
  else
    Exit;

  HistogramRange1[0] := 0;
  HistogramRange1[1] := 255;

  pHistogramRange := @HistogramRange1[0];

  hist_size[0] := 256;
  hist_size[1] := 300;

  nHistogramBins := 256;
  pHist := cvCreateHist(1, @hist_size[0], CV_HIST_ARRAY, @pHistogramRange);
  pImg := cvLoadImage(PChar(sFileName), CV_LOAD_IMAGE_GRAYSCALE);
  cvCalcHist(@pImg, pHist);
  cvGetMinMaxHistValue(pHist, nil, @dMaxHist, nil, nil);
  pHistImg := cvCreateImage(cvSize_(256, 300), IPL_DEPTH_8U, 3);
  cvZero(pHistImg);
  for i := 0 to nHistogramBins - 1 do
  begin
    OutputDebugString(PChar(Format('>>>>:%f', [cvQueryHistValue_1D(pHist, i)])));
    cvLine(pHistImg,
           cvPoint_(i, 300 - Trunc(cvQueryHistValue_1D(pHist, i) / dMaxHist * 300)),
           cvPoint_(i, 300),
           CV_RGB(127, 127, 127));
  end;
  cvNamedWindow('Histogram', 1);
  cvNamedWindow('Riverbank', 1);
  cvShowImage('Riverbank', pImg);
  cvShowImage('Histogram', pHistImg);
  cvWaitKey(0);
end;

 

直方图均匀化处理,消除局部过度曝光.

var
  pImg, pImg2: PIplImage;
  sFileName: string;
begin
  if OpenDialog1.Execute then
    sFileName := OpenDialog1.FileName
  else
    Exit;
  pImg := cvLoadImage(PChar(sFileName), CV_LOAD_IMAGE_GRAYSCALE);
  pImg2 := cvCreateImage(cvSize_(pimg.Width, pimg.Height), IPL_DEPTH_8U, 1);
  cvZero(pImg2);
  cvEqualizeHist(pImg, pImg2);
  cvNamedWindow('p1', 0);
  cvNamedWindow('p2', 0);
  cvShowImage('p1', pImg);
  cvShowImage('p2', pImg2);
  cvSaveImage(CTMPSAVEIMAGEPATH, pImg2);
  cvWaitKey(0);
  cvReleaseImage(pImg);
  cvReleaseImage(pImg2);
  cvDestroyWindow('p1');
  cvDestroyWindow('p2');
end;

均衡化前后直方图对比:

 

均匀化后的图像:

上面绘制的直方图没有计算最大直方图值,因此绘制超出了上边界,算法已改正。

原创粉丝点击