映像閾值化的基本思想是,給定一個數組和一個閾值,然後根據數組中每個元素是低於還是高於閾值而進行一些處理。
cvThreshold()函數如下:
double cvThreshold(CvArr* src, CvArr* dst,double threshold, double max_value, int threshold_type)
cvShold函數只能處理8位或者浮點灰階映像,靶心圖表像必須與源映像一致,或者為8為映像。
實現閾值化的代碼如下:
#include "stdafx.h"#include <highgui.h>#include <math.h>#include <cv.h>using namespace std;int main(){IplImage* sourceImage;IplImage* dstImage; if(!(sourceImage=cvLoadImage("Hough.jpg")))return -1;dstImage=cvCreateImage(cvGetSize(sourceImage),sourceImage->depth,1);IplImage* r=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,1);IplImage* g=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,1);IplImage* b=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,1);IplImage* tempImage=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,1);cvSplit(sourceImage,r,g,b,NULL);cvAddWeighted(r,1./3.,g,1./3.,0.0,tempImage);cvAddWeighted(tempImage,1,b,1./3.,0.0,tempImage);cvThreshold(tempImage,dstImage,100,255,CV_THRESH_BINARY);//對於大於100的設為255cvNamedWindow("sourceImage");cvNamedWindow("dstImage");cvShowImage("sourceImage",sourceImage);cvShowImage("dstImage",dstImage);cvWaitKey(-1);cvReleaseImage(&r);cvReleaseImage(&g);cvReleaseImage(&b);cvDestroyWindow("sourceImage");cvDestroyWindow("dstImage");cvReleaseImage(&sourceImage);cvReleaseImage(&dstImage);return 0;}
運行結果:
在自適應閾值中,閾值本身就是一個變數,實現自適應閾值的代碼如下:
#include "stdafx.h"#include <highgui.h>#include <math.h>#include <cv.h>int main(){IplImage* sourceImage;//直接以灰階映像載入if(!(sourceImage=cvLoadImage("Hough.jpg",CV_LOAD_IMAGE_GRAYSCALE)))return -1;IplImage* dstImage=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,1);//這個函數只能處理單通道映像或者8位元影像像,並且要求源映像與靶心圖表像不能為同一個映像cvAdaptiveThreshold(sourceImage,dstImage,255, //max_valCV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY,3, //block_size5 //offset);cvNamedWindow("AdaptiveThreshold",0);cvShowImage("AdaptiveThreshold",dstImage);//單一閾值IplImage* dstImage2=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,1);cvThreshold(sourceImage,dstImage2,100,255,CV_THRESH_BINARY);cvNamedWindow("sourceImage",0);cvNamedWindow("Threshold",0);cvShowImage("sourceImage",sourceImage);cvShowImage("Threshold",dstImage2);cvWaitKey(-1);//釋放資源cvDestroyWindow("sourceImage");cvDestroyWindow("Threshold");cvDestroyWindow("AdaptiveThreshold");cvReleaseImage(&sourceImage);cvReleaseImage(&dstImage);cvReleaseImage(&dstImage2);return 0;}
運行結果:
Reference《學習opencv》