1. 程式人生 > >【OpenCV筆記】影象預處理

【OpenCV筆記】影象預處理

void FillWhite(IplImage *pImage)  
{  
    cvRectangle(pImage, cvPoint(0, 0), cvPoint(pImage->width, pImage->height), CV_RGB(255, 255, 255), CV_FILLED);  
}  

//create histogram of gray image 
CvHistogram* CreateGrayImageHist(IplImage **ppImage)  
{  
    int nHistSize = 256;  
    float fRange[] = {0, 255};  //gray scale   
    float *pfRanges[] = {fRange};    
    CvHistogram *pcvHistogram = cvCreateHist(1, &nHistSize, CV_HIST_ARRAY, pfRanges);  
    cvCalcHist(ppImage, pcvHistogram);  
    return pcvHistogram;
}

IplImage *CreateHistImage(int nImageWidth, int nImageHeight, int nScale, CvHistogram *pcvHistogram)
{
	IplImage *pHistImg = cvCreateImage(cvSize(nImageWidth*nScale, nImageHeight),IPL_DEPTH_8U,1);
	FillWhite(pHistImg);

	//calculate the max histogram value
	float fMaxHistValue = 0;
	cvGetMinMaxHistValue(pcvHistogram, NULL, &fMaxHistValue, NULL, NULL);

	//draw each histogram block
	int i;
	for(i = 0;i < nImageWidth;i++){
		float fHistValue = cvQueryHistValue_1D(pcvHistogram, i);
		int nRealHeight = cvRound((fHistValue/fMaxHistValue) * nImageHeight);//height to draw
		cvRectangle(pHistImg,
			cvPoint(i*nScale,nImageHeight-1),
			cvPoint((i+1)*nScale-1,nImageHeight-nRealHeight),
			cvScalar(i,0,0,0),
			CV_FILLED);
	}
	return pHistImg;
}

void show_histogram()
{
	const char *pstrGrayWin = "Gray Image";
	const char *pstrHistWin = "Histogram Image";

	IplImage *pGrayImg = cvLoadImage("yueyu.jpg", CV_LOAD_IMAGE_GRAYSCALE);

	//gray histogram
	CvHistogram *pcvHist = CreateGrayImageHist(&pGrayImg);

	int nHistWidth = 255;
	int nHistHeight = 200;
	int nScale = 3;
	IplImage *pHistImg = CreateHistImage(nHistWidth,nHistHeight,nScale,pcvHist);

	//show
	cvNamedWindow(pstrGrayWin, CV_WINDOW_AUTOSIZE);
	cvNamedWindow(pstrHistWin, CV_WINDOW_AUTOSIZE);
	cvShowImage(pstrGrayWin, pGrayImg);
	cvShowImage(pstrHistWin, pHistImg);

	//wait for key
	cvWaitKey(0);

	cvReleaseHist(&pcvHist);

	cvDestroyWindow(pstrGrayWin);
	cvDestroyWindow(pstrHistWin);
	cvReleaseImage(&pGrayImg);
	cvReleaseImage(&pHistImg);
}

void show_gray_equalize()
{
	const char *pstrGrayWin = "Gray Image";
	const char *pstrGrayEqualWin = "Gray Image(Equalized)";
	const char *pstrHistWin = "Histogram Image";
	const char *pstrHistEqualWin = "Histogram Image(Equalized)";

	IplImage *pGrayImg = cvLoadImage("yueyu.jpg", CV_LOAD_IMAGE_GRAYSCALE);
	IplImage *pGrayEqualImg = cvCreateImage(cvGetSize(pGrayImg),IPL_DEPTH_8U,1);

	//gray histogram
	CvHistogram *pcvHist = CreateGrayImageHist(&pGrayImg);

	int nHistWidth = 255;
	int nHistHeight = 160;
	int nScale = 2;
	IplImage *pHistImg = CreateHistImage(nHistWidth,nHistHeight,nScale,pcvHist);

	//gray equalize
	cvEqualizeHist(pGrayImg, pGrayEqualImg);
	CvHistogram *pcvHistEqual = CreateGrayImageHist(&pGrayEqualImg);
	IplImage *pHistEqualImg = CreateHistImage(nHistWidth,nHistHeight,nScale,pcvHistEqual);

	//show
	cvNamedWindow(pstrGrayWin, CV_WINDOW_AUTOSIZE);
	cvNamedWindow(pstrHistWin, CV_WINDOW_AUTOSIZE);
	cvNamedWindow(pstrGrayEqualWin, CV_WINDOW_AUTOSIZE);
	cvNamedWindow(pstrHistEqualWin, CV_WINDOW_AUTOSIZE);
	cvShowImage(pstrGrayWin, pGrayImg);
	cvShowImage(pstrHistWin, pHistImg);
	cvShowImage(pstrGrayEqualWin, pGrayEqualImg);
	cvShowImage(pstrHistEqualWin, pHistEqualImg);

	//wait for key
	cvWaitKey(0);

	cvReleaseHist(&pcvHist);
	cvReleaseHist(&pcvHistEqual);

	cvDestroyWindow(pstrGrayWin);
	cvDestroyWindow(pstrHistWin);
	cvDestroyWindow(pstrGrayEqualWin);
	cvDestroyWindow(pstrHistEqualWin);
	cvReleaseImage(&pGrayImg);
	cvReleaseImage(&pHistImg);
	cvReleaseImage(&pGrayEqualImg);
	cvReleaseImage(&pHistEqualImg);
}

結果如圖: