博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opencv图像阈值化
阅读量:3959 次
发布时间:2019-05-24

本文共 3116 字,大约阅读时间需要 10 分钟。

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:表示邻域块大小,用来计算区域阈值,一般选择为3、5、7......等。参数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);}

转载地址:http://wumzi.baihongyu.com/

你可能感兴趣的文章