OpenCV學習筆記-自適應閾值化
阿新 • • 發佈:2018-12-31
自適應閾值化的函式為:
AdaptiveThreshold
自適應閾值方法
void cvAdaptiveThreshold( const CvArr* src, CvArr* dst, double max_value, int adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C, int threshold_type=CV_THRESH_BINARY, int block_size=3, double param1=5 );
- src
- 輸入影象.
- dst
- 輸出影象.
- max_value
- 使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值.
- adaptive_method
- 自適應閾值演算法使用:CV_ADAPTIVE_THRESH_MEAN_C 或 CV_ADAPTIVE_THRESH_GAUSSIAN_C (見討論).
- threshold_type
- 取閾值型別:必須是下者之一
- CV_THRESH_BINARY,
- CV_THRESH_BINARY_INV
- block_size
- 用來計算閾值的象素鄰域大小: 3, 5, 7, ...
- param1
- 與方法有關的引數。對方法 CV_ADAPTIVE_THRESH_MEAN_C 和 CV_ADAPTIVE_THRESH_GAUSSIAN_C, 它是一個從均值或加權均值提取的常數(見討論), 儘管它可以是負數。
函式 cvAdaptiveThreshold 將灰度影象變換到二值影象,採用下面公式:
threshold_type=CV_THRESH_BINARY: dst(x,y) = max_value, if src(x,y)>T(x,y) 0, otherwise threshold_type=CV_THRESH_BINARY_INV: dst(x,y) = 0, if src(x,y)>T(x,y) max_value, otherwise
其中 TI 是為每一個象素點單獨計算的閾值
對方法 CV_ADAPTIVE_THRESH_MEAN_C,先求出塊中的均值,再減掉param1。
對方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出塊中的加權和(gaussian), 再減掉param1。
================================================================================================================
下面的例題對閾值化和自適應閾值化進行了比較:
#include "StdAfx.h"
#include <cv.h>
#include <highgui.h>
#include <math.h>
IplImage* Igray = 0;
IplImage* It = 0;
IplImage* Iat;
void main()
{
Igray = cvLoadImage("lena.png", CV_LOAD_IMAGE_GRAYSCALE);
It = cvCreateImage(cvSize(Igray->width, Igray->height),IPL_DEPTH_8U, 1);
Iat = cvCreateImage(cvSize(Igray->width, Igray->height),IPL_DEPTH_8U, 1);
cvThreshold(Igray, It, 150, 255,CV_THRESH_BINARY);
cvAdaptiveThreshold(Igray, Iat, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 3, 5);
cvNamedWindow("orignal", 1);
cvNamedWindow("threshold", 1);
cvNamedWindow("adaptiveThresh", 1);
cvShowImage("orignal", Igray);
cvShowImage("threshold", It);
cvShowImage("adaptiveThresh", Iat);
cvWaitKey(0);
cvReleaseImage(&Igray);
cvReleaseImage(&It);
cvReleaseImage(&Iat);
cvDestroyWindow("orignal");
cvDestroyWindow("threshold");
cvDestroyWindow("adaptiveThresh");
}
運算結果為:
參考文獻:
1.學習OpenCV,於仕祺,劉瑞禎,清華大學出版社,pp.159-161