OpenCV图像阈值操作(12)
  Jk5625xsZPHl 2023年11月02日 47 0

什么是阈值

阈值又叫临界值,是指一个效应能够产生的最低值或最高值。实际上是基于图片亮度的一个黑白分界值,默认值是50%中性灰,即128,亮度高于128(<50%的灰)的会变白,低于128(>50%的灰)的会变黑。从一副图像中利用阈值分割出我们需要的物体部分(当然这里的物体可以是一部分或者整体)。这样的图像分割方法是基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分割。为了从一副图像中提取出我们需要的部分,应该用图像中的每一个像素点的灰度值与选取的阈值进行比较,并作出相应的判断。(注意:阈值的选取依赖于具体的问题。即:物体在不同的图像中有可能会有不同的灰度值)。

阈值化分类

二进制阈值化

处理方案

OpenCV图像阈值操作(12)_像素点

效果图

OpenCV图像阈值操作(12)_图像阈值操作_02

运用该阈值类型的时候,先要选定一个特定的阈值量,比如:125,这样,新的阈值产生规则可以解释为大于125的像素点的灰度值设定为最大值(如8位灰度值最大为255),灰度值小于125的像素点的灰度值设定为0。

反二进制阈值化

处理方案

OpenCV图像阈值操作(12)_像素点_03

效果图

OpenCV图像阈值操作(12)_图像阈值操作_04

该阈值化与二进制阈值化相似,先选定一个特定的灰度值作为阈值,不过最后的设定值相反。(在8位灰度图中,例如大于阈值的设定为0,而小于该阈值的设定为255)。

截断阈值化

处理方案

OpenCV图像阈值操作(12)_像素点_05

效果图

OpenCV图像阈值操作(12)_图像阈值操作_06

同样首先需要选定一个阈值,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变。(例如:阈值选取为125,那小于125的阈值不改变,大于125的灰度值(230)的像素点就设定为该阈值)。

阈值化为0

处理方案

OpenCV图像阈值操作(12)_像素点_07

效果图

OpenCV图像阈值操作(12)_灰度值_08

先选定一个阈值,然后对图像做如下处理:像素点的灰度值大于该阈值的不进行任何改变;像素点的灰度值小于该阈值的,其灰度值全部变为0。

反阈值化为0

处理方案

OpenCV图像阈值操作(12)_#include_09

效果图

OpenCV图像阈值操作(12)_图像阈值操作_10

阈值操作函数

double threshold( InputArray src, OutputArray dst,double thresh, double maxval, int type );
/*******************************************************************
*			src: 					输入图像
*			dst:					输出图像
*			thresh:					阈值的具体值
*			maxval:				 	 阈值的最大值
*			type:				 	 阈值操作类型
*********************************************************************/
//阈值操作类型
enum ThresholdTypes {
    THRESH_BINARY     = 0, 		//二进制
    THRESH_BINARY_INV = 1, 		//反二进制
    THRESH_TRUNC      = 2, 		//截断
    THRESH_TOZERO     = 3, 		//阈值化为0
    THRESH_TOZERO_INV = 4, 		//反阈值化为0
    THRESH_MASK       = 7,		//自适应阈值
    THRESH_OTSU       = 8,		//利用最大类间方差法(OTSU)求出对图像进行二值化处理的最佳阈值
    THRESH_TRIANGLE   = 16 		//三角算法选择最优阈值  
};

综合代码

#include <iostream>
#include <map>
#include <string>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class Threshold
{
public:
	Threshold() :img(imread("test.jpg"))
	{
		result["原图"] = img;
	}
	void Show()
	{
		for (auto& v : result) 
		{
			imshow(v.first, v.second);
		}
		waitKey(0);
	}
	void Testthreshold() 
	{
		threshold(img, result["二进制"], 125, 188, THRESH_BINARY);
		threshold(img, result["反二进制"], 125, 188, THRESH_BINARY_INV);
		threshold(img, result["截断"], 125, 188, THRESH_TRUNC);
		threshold(img, result["阈值化为0"], 125, 188, THRESH_TOZERO);
		threshold(img, result["反阈值化为0"], 125, 188, THRESH_TOZERO_INV);
		//threshold(img, result["自适应"], 125, 188, THRESH_MASK);
		//threshold(img, result["最大类间方差法"], 125, 255, THRESH_OTSU);
		//threshold(img, result["三角算法"], 125, 255, THRESH_TRIANGLE);
	}
private:
	Mat img;
	map<string, Mat> result;
};
int main() 
{
	Threshold* pthresh = new Threshold;
	pthresh->Testthreshold();
	pthresh->Show();
	return 0;
}

OpenCV图像阈值操作(12)_图像阈值操作_11

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  gBkHYLY8jvYd   2023年12月06日   50   0   0 #includecii++
  gBkHYLY8jvYd   2023年11月19日   27   0   0 #includecic++
  gBkHYLY8jvYd   2023年11月19日   14   0   0 #includeios数据
  gBkHYLY8jvYd   2023年11月19日   25   0   0 #include子树结点
  gBkHYLY8jvYd   2023年11月19日   24   0   0 #includei++数据
  gBkHYLY8jvYd   2023年11月19日   27   0   0 #include数组ci
  gBkHYLY8jvYd   2023年12月10日   18   0   0 #include邻域灰度图像
  gBkHYLY8jvYd   2023年12月10日   22   0   0 #include数组i++
  gBkHYLY8jvYd   2023年12月06日   19   0   0 #includeios数据
  gBkHYLY8jvYd   2023年12月08日   20   0   0 #includecii++
  gBkHYLY8jvYd   2023年11月19日   23   0   0 #includeiosci
  gBkHYLY8jvYd   2023年11月22日   23   0   0 #include十进制高精度
  gBkHYLY8jvYd   2023年11月22日   26   0   0 #includeiosci
Jk5625xsZPHl