opencv图像阈值化

本文介绍了OpenCV中的图像阈值化技术,包括固定阈值和自适应阈值两种方法。固定阈值通过单一阈值将图像分割为两部分,而自适应阈值则根据像素周围区域的灰度差异进行动态调整。通过Trackbar可以实时调试阈值效果,适应不同光照条件下的图像处理需求。代码示例展示了如何使用OpenCV的threshold和adaptiveThreshold函数进行操作。
摘要由CSDN通过智能技术生成

1.简介

  • 图像阈值化是图像处理的重要基础部分,应用很广泛,可以根据灰度差异来分割图像不同部分
  • 阈值化处理的图像―般为单通道图像(厌度图)阈值化参数的设置可以使用滑动条来debug阈值化处理易光照影响,处理时应注意

threshold是固定阈值,就是根据这个点的像素值把它装换成对于的值
adaptiveThreshold是自适应阈值,它可以根据周围点的像素值来对于调整这个点的像素值
面对阈值化时最好做Trackbar来看一下效果

2.threshold

2.1api

threshold(src_gray, dst, threshold_value, max_BINARY_value,threshold_type );
//src_gray: 输入的灰度图像的地址。
//dst: 输出图像的地址。
//threshold_value: 进行阈值操作时阈值的大小。
//max_BINARY_value: 设定的最大灰度值(该参数运用在二进制与反二进制阈值操作中)。
//threshold_type: 阈值的类型。从下面提到的5种中选择出的结果。

threshold_type类型:
在这里插入图片描述

2.2代码演示

Mat srcImg = imread("E:\\OpenCV\\images\\lf.jpg",0);
Mat dstImg;
threshold(srcImg, dstImg, 100, 255, THRESH_BINARY);
imshow("dst", dstImg);
imshow("img", srcImg);
waitKey(0);

在这里插入图片描述

3.adaptiveThreshold自适应阈值

3.1api

void adaptiveThreshold( InputArray src, OutputArray dst, double maxValue, int adaptiveMethod,int thresholdType, int blockSize, double C );
参数1:InputArray类型的src,输入图像,填单通道,单8位浮点类型Mat即可。

参数2:函数运算后的结果存放在这。即为输出图像(与输入图像同样的尺寸和类型)。

参数3:预设满足条件的最大值。

参数4:指定自适应阈值算法。可选择ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C两种。

ADAPTIVE_THRESH_MEAN_C,为局部邻域块的平均值。该算法是先求出块中的均值,再减去常数C。

ADAPTIVE_THRESH_GAUSSIAN_C ,为局部邻域块的高斯加权和。该算法是在区域中(x,y)周围的像素根据高斯函数按照他们离中心点的距离进行加权计算, 再减去常数C。

参数5:指定阈值类型。可选择THRESH_BINARY或者THRESH_BINARY_INV两种。(即二进制阈值或反二进制阈值)。

参数6:表示邻域块大小,用来计算区域阈值,一般选择为357......等。

参数7:参数C表示与算法有关的参数,它是一个从均值或加权均值提取的常数,可以是负数。

3.2代码演示

	Mat srcImg = imread("E:\\OpenCV\\images\\lf.jpg",0);
	Mat dstImg;
	adaptiveThreshold(srcImg, dstImg, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 3,0);
	imshow("dst", dstImg);
	imshow("img", srcImg);
	waitKey(0);

在这里插入图片描述

4.Trackbar下阈值效果展示

#include "opencv2/opencv.hpp"

using namespace cv;
Mat srcImg, dstImg;
Mat dstImg2;
int thres_min = 20;
int block_size = 3;
int C0 = 3;
void OnThreshold(int, void* )
{
	threshold(srcImg, dstImg, thres_min, 255, CV_THRESH_BINARY);
	imshow("src", srcImg);
	imshow("固定阈值", dstImg);
}
 
void OnAdaptiveThreshold(int, void* )
{
	if(block_size % 2==0) //如果block_size是偶数
		block_size++;
	adaptiveThreshold(srcImg, dstImg2, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY_INV, block_size, C0);
	imshow("自适应阈值", dstImg2);
}

void main()
{
	srcImg = imread("0.bmp", 0);  //以灰度模式读取
	medianBlur(srcImg, srcImg, 5);
	namedWindow("固定阈值", CV_WINDOW_AUTOSIZE);
	namedWindow("自适应阈值", CV_WINDOW_AUTOSIZE);
	//cvtColor(srcImg, dstImg, CV_BGR2GRAY);
	//threshold(srcImg, dstImg, 100, 255, CV_THRESH_BINARY);
	//threshold(srcImg, dstImg, 100, 255, CV_THRESH_BINARY_INV);
	//threshold(srcImg, dstImg, 100, 255, CV_THRESH_TRUNC);
	//threshold(srcImg, dstImg, 100, 255, CV_THRESH_TOZERO);
	//threshold(srcImg, dstImg, 100, 255, CV_THRESH_TOZERO_INV);
	//adaptiveThreshold(srcImg, dstImg, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 11, 5);
	//adaptiveThreshold(srcImg, dstImg, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 11, 5);
	createTrackbar("Threshold", "固定阈值", &thres_min, 255, OnThreshold, 0);
	createTrackbar("Block_Size", "自适应阈值", &block_size, 255,OnAdaptiveThreshold, 0);
	createTrackbar("C", "自适应阈值", &C0, 255, OnAdaptiveThreshold, 0);

	OnThreshold(thres_min, 0);  //回调函数初始化
	OnAdaptiveThreshold(block_size, 0);
	OnAdaptiveThreshold(C0, 0);

	//imshow("src", srcImg);
	//imshow("dst", dstImg);

	waitKey(0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值