导览
OpenCV中的二值化方法
01
threshold(..,thr,...)和threshold(...,Thr_OTSU,...)
自定义阈值
采用低/高 通滤波的方法
double threshold
(
InputArray src, //输入
OutputArray dst,//输出
double thresh, //自定义阈值
double maxval, //二值化的最大值
int type //二值化类型,有五种类型具体见手册
);
如果把自定义阈值设置为 CV::THRESH_OTSU,则这个方法会自动计算一个阈值
注:thresshold()可以看做对图像数组做的一个1x1的核的卷积
02
CV::adativethreshold()
adativethreshold()在卷积过程中自动计算每个核的阈值
void adaptiveThreshold
(
InputArray src, //输入
OutputArray dst,//输出
double maxValue,//二值化最大值
int adaptiveMethod,//加权方法0:均值 1:高斯
int thresholdType,//阈值类型
int blockSize,//核大小
double C//常数C
);
注1:adativethreshold()自适应阈值是一个利用blocksize参数设置大小的核的卷积方法
注2:blocksize必须为奇数,保证核唯一
注3:加权方法为均值,0:核内所有数据均值加权,1:核内数据加权是以到锚点的高斯距离来加权
15*15核,不同常数C对比
C=10,不同核大小对比
02
工程代码
int main(int argc, char**argv) {
cv::VideoCapture cap;
cv::namedWindow("camrea_video", CV_WINDOW_AUTOSIZE);
int pos=15;
int*a = &pos;
cv::createTrackbar("scroller", "camrea_video",a, 30);
cap.open(1);
cv::Mat frame;
cv::Mat frame1;
for (;;)
{
cap >> frame;
//cv::threshold(frame, frame,cv::THRESH_OTSU, 255, cv::THRESH_TOZERO);
cv::cvtColor(frame, frame1, cv::COLOR_BGR2GRAY);
if (*a%2==0)
{
*a=*a+1;
}
cv::adaptiveThreshold(frame1, frame1, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, *a, 10);
if (frame.empty())
{
break;
}
//cv::putText(frame,ToString(cap.get(cv::CAP_PROP_POS_MSEC)), cv::Point(100, 100),cv::FONT_HERSHEY_SIMPLEX,1,cv::Scalar(0,0,255));
cv::imshow("camrea_video", frame1);
if (cv::waitKey(100) >= 0)
{
break;
}
}
return 0;
}
小结
OpenCV中的二值化方法
CV::threshold(..,thr,...)
CV::threshold(...,Thr_OTSU,...)
CV::adativethreshold()