函数理解
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通道的
从元素的上的变化来看,在二值化之后
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);
图片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的理解,希望对你有所的帮助