我是靠谱客的博主 俏皮狗,最近开发中收集的这篇文章主要介绍OpenCvSharp 学习笔记14 --基本的阈值操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一:图像阈值概念(thresholding)

阈值是什么?简单的说就是图像分割的标尺。
举例说明,看下面图片
在这里插入图片描述
有一堆苹果,有你喜欢的和你不喜欢的,怎样区分你喜欢的和不喜欢的,在你心中有一个标准,那我们就把这个标准量化来表示,比如,红色的是你喜欢的,其他的是你不喜欢的。那么,这个 “红色” 相当与阈值。分割出你喜欢的和你不喜欢的。同理,在图片中,一个简单的阈值例子就是选择一个像素值p,然后将小于p的所有像素强度设置为零(或其他操作),并且将所有像素值大于p设置为255(或其他操作).以这种方式,我们能够创建图像的二进制表示。选择的像素 P 就是图像的阈值,而根据 P 对图像所作的操作就叫阈值操作。
在OpenCv 中提供了两中阈值算法。

二:阈值类型

1,阈值二值化(threshold binary):

如下图,在左下的图表示图像像素点 s r c ( x , y ) src(x,y) src(x,y) 值的分布情况,蓝色的水平线条表示阈值,大于阈值的让它等于最大值,小于的等于最小值。在 Input 中只有 3 个区域大于阈值,所以 Output 中有3块区域是最大值,其他的都是最小值。
在这里插入图片描述
This operation can be expressed as:
d s t ( x , y ) = { m a x v a l , i f ( s r c ( x , y ) > t h r e s h ) 0 , o t h e r w i s e dst(x,y)=begin{cases} maxval , if (src(x,y)>thresh) \ 0, otherwiseend{cases} dst(x,y)={maxvalif(src(x,y)>thresh)0otherwise

2,反二值化阈值(threshold binary Inverted):
与上面的二值化阈值相反,大于阈值为最小值,小于阈值为最大值
在这里插入图片描述
This operation can be expressed as:
d s t ( x , y ) = { 0 , i f ( s r c ( x , y ) > t h r e s h ) m a x v a l , o t h e r w i s e dst(x,y)=begin{cases} 0 , if (src(x,y)>thresh) \ maxval, otherwiseend{cases} dst(x,y)={0if(src(x,y)>thresh)maxvalotherwise

3,截断(truncate):
如下图所示:大于蓝色阈值水平线的等于阈值,小于的保持不变。
在这里插入图片描述
This operation can be expressed as:
d s t ( x , y ) = { t h r e s h o l d , i f ( s r c ( x , y ) > t h r e s h ) s r c ( x , y ) , o t h e r w i s e dst(x,y)=begin{cases} threshold, if (src(x,y)>thresh) \ src(x,y), otherwiseend{cases} dst(x,y)={thresholdif(src(x,y)>thresh)src(x,y)otherwise

4,阈值取零(threshold to zero):
如图所示,大于蓝色阈值水平线的爆出不变,小于的全部取最小值(0)。
在这里插入图片描述
This operation can be expressed as:

d s t ( x , y ) = { s r c ( x , y ) , i f ( s r c ( x , y ) > t h r e s h ) 0 , o t h e r w i s e dst(x,y)=begin{cases} src(x,y), if (src(x,y)>thresh) \ 0, otherwiseend{cases} dst(x,y)={src(x,y)if(src(x,y)>thresh)0otherwise

5,阈值反取零(threshold to zero Inverted):
与阈值取零相反,大于时为最小值,小于时保持不变。
在这里插入图片描述
This operation can be expressed as:

d s t ( x , y ) = { 0 , i f ( s r c ( x , y ) > t h r e s h ) s r c ( x , y ) , o t h e r w i s e dst(x,y)=begin{cases} 0, if (src(x,y)>thresh) \ src(x,y), otherwiseend{cases} dst(x,y)={0if(src(x,y)>thresh)src(x,y)otherwise

三,API

Cv2.Threshold():对每个数组元素应用固定级别阈值。

参数说明
InputArray srcinput array (single-channel, 8-bit or 32-bit floating point).
OutputArray dstoutput array of the same size and type as src.
double threshthreshold value. 阈值
double maxval要与阈值二进制和阈值binary_inv阈值类型一起使用的最大值。
ThresholdTypes type阈值类型 (枚举类型,前面的5中,加上两种阈值寻找算法)

代码:

  static Mat src;
        static int thresHold_value = 127;
        static int thresHold_max = 255;
        static int type_value = 2;
        static int type_max = 4;
        static int data=0;
        /// <summary>
        /// 图像阈值操作
        /// </summary>
        private static void ThresHold(string path)
        {
            using (src = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth))
            using (Mat dst = new Mat())
            {
                CvTrackbarCallback2 cvtCallback = new CvTrackbarCallback2(CallBackDome);
                CvTrackbarCallback2 cvtCallbackType = new CvTrackbarCallback2(CallBackDome2);
                new Window("SRC", WindowMode.Normal, src);
                src.CopyTo(dst);
                new Window("DST", WindowMode.Normal, dst);
                CvTrackbar cvt = new CvTrackbar("Bar :", "DST", thresHold_value, thresHold_max, cvtCallback, dst);
                CvTrackbar cvt2 = new CvTrackbar("Type :", "DST", type_value, type_max, cvtCallbackType, dst);

                Cv2.WaitKey(0);

            }
        }

        private static void CallBackDome2(int pos, object userdata)
        {
            Mat m = (Mat)userdata;
            data = pos;
            Cv2.CvtColor(src, m, ColorConversionCodes.RGB2GRAY); //转为灰度(前提条件,必须要转换才能操作阈值)
            Cv2.Threshold(m, m, 0, thresHold_max, (ThresholdTypes)(pos) | ThresholdTypes.Triangle); //三角自动计算阈值法
           //Cv2.Threshold(m, m, 0, thresHold_max, (ThresholdTypes)(type)|ThresholdTypes.Otsu); //自动计算阈值
            new Window("DST", WindowMode.Normal, m);
        }
        
        /// <summary>
        /// 调用函数
        /// </summary>
        /// <param name="size">阈值和阈值类型公用字段,需要做判断</param>
        /// <param name="userdate"></param>
        private static void CallBackDome(int size, object userdate)
        {
            Mat m = (Mat)userdate;
           
            Cv2.CvtColor(src, m, ColorConversionCodes.RGB2GRAY); //转为灰度(前提条件,必须要转换才能操作阈值)
            Cv2.Threshold(m, m, size, thresHold_max, (ThresholdTypes)(data)); //自定义类型和阈值

            new Window("DST", WindowMode.Normal, m);
        }

上面程序定义了阈值和类型两个滑块,滑动滑块,不同的值得到不同的结果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

最后

以上就是俏皮狗为你收集整理的OpenCvSharp 学习笔记14 --基本的阈值操作的全部内容,希望文章能够帮你解决OpenCvSharp 学习笔记14 --基本的阈值操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部