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;
均衡化前后直方图对比:
均匀化后的图像:
上面绘制的直方图没有计算最大直方图值,因此绘制超出了上边界,算法已改正。