【OpenCV筆記】影象預處理
阿新 • • 發佈:2018-12-25
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); }
結果如圖: