Opencv java 二值化函数threshold (10)

函数理解

threshold 英语的意思是门槛,门槛的意思说要么在门槛外,要么在门槛内,并且门槛具有一定的条件要求

接下来我们看在opencv中如何使用该函数

		Imgproc.threshold(src, dst2, thresh, maxval, type)

src 是输入的函数图像

dst 是输出的函数图像

thresh 是门槛,当矩阵中的元素值>thresh 取值a; 当小于<thresh取值为b 

maxval 取值b的时候的最大值

type 门槛类型

 

BINARY 和 BINARY_INV(阈值二值化 和 反阈值二值化)

我们如何来使用这个函数,如何来观察值的变化,我们通过一个例子,首先我们取出一个图像,直接进行二值化处理

	    String filename = "D:\\svnp\\MyYan\\res\\drawable\\lena.png";
		Mat src = Imgcodecs.imread(filename);
		Mat dst1 = new Mat();
		Imgproc.threshold(src, dst1, 125, 200, Imgproc.THRESH_BINARY);
		HighGui.imshow("原图", src);
		HighGui.imshow("二值化",dst1);
		HighGui.waitKey(10);

 结果:

那么图像是经过下面的处理为什么会变成这个样子:

Imgproc.threshold(src, dst1, 125, 200, Imgproc.THRESH_BINARY);

我们截取矩阵中的一部分元素看一下变化

在二值化前后,图像对象的矩阵都是3通道的

图片1
 

从元素的上的变化来看,在二值化之后

Imgproc.threshold(src, dst1, 125, 255, Imgproc.THRESH_BINARY);

在元素里面凡是>125的都变成的都变成了255 其实是我们设置的maxval

凡是小于125的都变成了0

THRESH_BINARY 和THRESH_BINARY_INV 两个元素是对应的

THRESH_BINARY  阀值二值化

THRESH_BINARY_INV  反阀值二值化

Imgproc.threshold(src, dst1, 125, 255, Imgproc.THRESH_BINARY_INV);

图片2
 

图片1 是阀值二值化对应的矩阵,图片2是反阀值二值化对应的矩阵,我们可以看到的是两个是证号相反的

下面我们从图片进行看差别:

 上面的图片是黑白颠倒

THRESH_TOZERO 和 THRESH_TOZERO_INV (阈值取零和反阈值取零)

先看效果:

		String filename = "D:\\svnp\\MyYan\\res\\drawable\\lena.png";
		Mat src = Imgcodecs.imread(filename);
		Mat dst = new Mat();
		Mat dst1 = new Mat();
		Mat dst2 = new Mat();		
		Imgproc.cvtColor(src, dst2, Imgproc.COLOR_BGR2GRAY);
		Imgproc.threshold(dst2, dst, 125, 255, Imgproc.THRESH_TOZERO);
		Imgproc.threshold(dst2, dst1, 125, 255, Imgproc.THRESH_TOZERO_INV);
		HighGui.imshow("原图", src);
		HighGui.imshow("阀值取零",dst);
		HighGui.imshow("反阀值取零",dst1);
		HighGui.waitKey(10);

 通过对比我们可以发现阀值取零和发阀值取零两个操作是不同的,,并且是对立的

我们来看看矩阵对应的值:

THRESH_TOZERO:可以看到的是当灰度值大于我们设置的阀值的时候,灰度值大小不变,如果小于设置的阀值,则取值为零

 THRESH_TOZERO_INV:可以看到的是当灰度值小于我们设置的阀值的时候,灰度值大小不变,如果大于设置的阀值,则取值为零

阀值截断 THRESH_TRUNC

		String filename = "D:\\svnp\\MyYan\\res\\drawable\\lena.png";
		Mat src = Imgcodecs.imread(filename);
		Mat dst = new Mat();
		Mat dst1 = new Mat();
		Mat dst2 = new Mat();
		Imgproc.cvtColor(src, dst2, Imgproc.COLOR_BGR2GRAY);
		Mat submat=new Mat(dst2, new Rect(new Point(20,20),new Point(40,40)));
		System.out.println(submat.dump());
		Imgproc.threshold(dst2, dst, 160, 255, Imgproc.THRESH_TRUNC);
		HighGui.imshow("原图", src);
		HighGui.imshow("阀值截断",dst);
		HighGui.waitKey(10);

效果图:

截断前后数据值对比:

 小于阀值的灰度值不变,大于阀值的灰度值变成灰度值

三角阀值 THRESH_TRIANGLE

		String filename = "D:\\svnp\\MyYan\\res\\drawable\\lena.png";
		Mat src = Imgcodecs.imread(filename);
		Mat dst = new Mat();
		Mat dst1 = new Mat();
		Mat dst2 = new Mat();
		Imgproc.cvtColor(src, dst2, Imgproc.COLOR_BGR2GRAY);
		Mat submat=new Mat(dst2, new Rect(new Point(20,20),new Point(40,40)));	
		System.out.println(submat.dump());
		Imgproc.threshold(dst2, dst, 160, 255, Imgproc.THRESH_TRIANGLE);
		HighGui.imshow("原图", src);
		HighGui.imshow("三角阀值",dst);
		HighGui.waitKey(10);

 

Mat矩阵对应的变化

但是我们代码中设置的阀值是160 

我们可以看到的是凡是大于117 的都变成了255 ,小于117 的都变成了0,那么这个117是哪里来的,和我们设置的阀值有没有关系

å¨è¿éæå¥å¾çæè¿°

117 是这样获取到的,和我们设置的阀值大小没有关系,是自动计算出来的

 最大类差法 THRESH_OUTS

对应的灰度值的变化:

自动生成阀值,大于阀值的为255 ,小于阀值的为0

 

其中THRESH_MASK 没有图像输出,目前还不支持

使用threshold可以看出目的是将目标图像在整个图片中突显出来,希望对你有所帮助

上面是对threshold的理解,希望对你有所的帮助

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值