精华内容
下载资源
问答
  • 基于opencv函数库对图像进行二值化与细化操作
  • 这是一段基于OpenCV图像二值化实例代码,阈值可以通过滑动条来调节,可以观察不同阈值。具体分析见博客http://blog.csdn.net/primetong/article/details/79211648
  • opencv图像二值化的实现

    千次阅读 2020-06-18 20:18:52
    本文详细介绍基于opencv图像二值化图像二值化即是设置一个阈值T,如果图像像素点的灰度值小于T此点值设为0(黑),反之设为255(白),最后图像只有黑和白两种颜色。 opencv中的二值化函数有两种,阈值化的图像...

    本文详细介绍基于opencv的图像二值化,图像二值化即是设置一个阈值T,如果图像像素点的灰度值小于T此点值设为0(黑),反之设为255(白),最后图像只有黑和白两种颜色。

    opencv中的二值化函数有两种,阈值化的图像二值化,自适应阈值化的二值化,我们接下来先介绍两种二值化函数:

    1、阈值化函数:

    cvThreshold (constCvArr* src, CvArr* dst, double threshold, double  max_value,int threshold_type)

    • src –原始数组 (单通道 , 8-bit of 32-bit 浮点数)。

    • dst –输出数组,必须与 src 的类型一致,或者为 8-bit。

    • thresh –阈值。

    • max_value –使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值。

    • threshold_type –对图像取阈值的方法。

    如果threshold_type=CV_THRESH_BINARY:

    if src(x,y)>threshold dst(x,y) = max_value,  else dst(x,y) =0.

    如果threshold_type=CV_THRESH_BINARY_INV:

    if src(x,y)>threshold dst(x,y) = 0,  else dst(x,y) =max_value.

    如果threshold_type=CV_THRESH_TRUNC:

    if src(x,y)>threshold dst(x,y) = threshold ,  else dst(x,y) =src(x,y).

    如果threshold_type=CV_THRESH_TOZERO:

    if src(x,y)>threshold dst(x,y) = src(x,y),  else dst(x,y) =0.

    如果threshold_type=CV_THRESH_TOZERO_INV:

    if src(x,y)>threshold dst(x,y) = 0,  else dst(x,y) =src(x,y).

    2、自适应阈值化函数

    cvAdaptiveThreshold ( const CvArr* src, CvArr* dst, double max_value, int                                      adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C, 

                                         int thresthold_type= CV_THRESH_BINARY,    

                                         int block_size=3, double param1=5)

    • src :输入图像.

    • dst :输出图像.

    • max_value :使用 CV_THRESH_BINARY 和CV_THRESH_BINARY_INV 的最大值.

    • adaptive_method:自适应阈值算法使用:CV_ADAPTIVE_THRESH_MEAN_C 或 CV_ADAPTIVE_THRESH_GAUSSIAN_C .

      函数 cvAdaptiveThreshold 将灰度图像变换到二值图像,采用下面公式:

      如果threshold_type=CV_THRESH_BINARY:

            if src(x,y)>threshold dst(x,y) = max_value,  else dst(x,y) =0.

            如果threshold_type=CV_THRESH_BINARY_INV:

            if src(x,y)>threshold dst(x,y) = 0,  else dst(x,y) =max_value.

    • threshold_type:取阈值类型:必须是下者之一

      (1)CV_THRESH_BINARY,

      (2)CV_THRESH_BINARY_INV

    • block_size :用来计算阈值的象素邻域大小: 3, 5, 7, ...

    • param1:与方法有关的参数。对方CV_ADAPTIVE_THRESH_MEAN_C 和 CV_ADAPTIVE_THRESH_GAUSSIAN_C, 它是一个从均值或加权均值提取的常数, 尽管它可以是负数。

     

    • 阈值化二值化实现代码:

    #include <opencv2/opencv.hpp>
    
    #include<iostream>
    
    using namespace cv;
    
    using namespace std;
    
    void main()
    
    {
    
        ​    ​Mat src, imgGray;
    
        ​    ​Mat dst1,dst2,dst3,dst4,dst5;
    
        ​    ​src = imread("lena.jpg");
    
        ​    ​namedWindow("src", WINDOW_NORMAL);
    
        ​    ​imshow("src", src);
    
        ​    ​if(src.channels()>1)
    
        ​    ​    ​cvtColor(src, imgGray, CV_BGR2GRAY);//二值化前先进行灰度转换
    
        ​    ​else imgGray = src;
    
        ​    ​//threshold_type=CV_THRESH_BINARY:
    
        ​    ​threshold(imgGray,dst1,120,255, CV_THRESH_BINARY);
    
        ​    ​namedWindow("CV_THRESH_BINARY", WINDOW_NORMAL);
    
        ​    ​imshow("CV_THRESH_BINARY", dst1);
    
        ​    ​
    
        ​    ​//threshold_type=CV_THRESH_BINARY_INV:
    
        ​    ​threshold(imgGray, dst2, 120, 255, CV_THRESH_BINARY_INV);
    
        ​    ​namedWindow("CV_THRESH_BINARY_INV", WINDOW_NORMAL);
    
        ​    ​imshow("CV_THRESH_BINARY_INV", dst2);
    
        ​    ​
    
        ​    ​//threshold_type=CV_THRESH_TRUNC:
    
        ​    ​threshold(imgGray, dst3, 120, 255, CV_THRESH_BINARY_INV);
    
        ​    ​namedWindow("CV_THRESH_TRUNC", WINDOW_NORMAL);
    
        ​    ​imshow("CV_THRESH_TRUNC", dst3);
    
        ​    ​
    
        ​    ​//threshold_type=CV_THRESH_TOZERO:
    
        ​    ​threshold(imgGray, dst4, 120, 255, CV_THRESH_TOZERO);
    
        ​    ​namedWindow("CV_THRESH_TOZERO", WINDOW_NORMAL);
    
        ​    ​imshow("CV_THRESH_TOZERO", dst4);
    
        ​    ​
    
        ​    ​//threshold_type=CV_THRESH_TOZERO_INV:
    
        ​    ​threshold(imgGray, dst5, 120, 255, CV_THRESH_TOZERO_INV);
    
        ​    ​namedWindow("CV_THRESH_TOZERO_INV", WINDOW_NORMAL);
    
        ​    ​imshow("CV_THRESH_TOZERO_INV", dst5);
    
        ​    ​
    
        ​    ​waitKey();
    
    }

    结果:

                         src                                                       CV_THRESH_BINARY                    CV_THRESH_BINARY_INV

               CV_THRESH_TRUNC                                 CV_THRESH_TOZERO                  CV_THRESH_TOZERO_INV

     

     

    • 自适应阈值化实现代码:

    #include <opencv2/opencv.hpp>
    
    #include<iostream>
    
    using namespace cv;
    
    using namespace std;
    
    void main()
    
    {
    
        ​    ​Mat src, imgGray;
    
        ​    ​Mat dst1,dst2;
    
        ​    ​src = imread("lena.jpg");
    
        ​    ​namedWindow("src", WINDOW_NORMAL);
    
        ​    ​imshow("src", src);
    
        ​    ​if(src.channels()>1)
    
        ​    ​    ​cvtColor(src, imgGray, CV_BGR2GRAY);//二值化前先进行灰度转换
    
        ​    ​else imgGray = src;
    
        ​    ​
    
        ​    ​//threshold_type=CV_THRESH_BINARY:
    
        ​    ​adaptiveThreshold(imgGray,dst1,255,ADAPTIVE_THRESH_MEAN_C,  CV_THRESH_BINARY,25,5);
    
        ​    ​namedWindow("CV_THRESH_BINARY", WINDOW_NORMAL);
    
        ​    ​imshow("CV_THRESH_BINARY", dst1);
    
        ​    ​
    
        ​    ​//threshold_type=CV_THRESH_BINARY_INV:
    
        ​    ​adaptiveThreshold(imgGray, dst2, 255, ADAPTIVE_THRESH_MEAN_C,   CV_THRESH_BINARY_INV, 25, 5);
    
        ​    ​namedWindow("CV_THRESH_BINARY_INV", WINDOW_NORMAL);
    
        ​    ​imshow("CV_THRESH_BINARY_INV", dst2);
    
        ​    ​
    
        ​    ​waitKey();
    
    }

     

    结果:

                                    src                                                CV_THRESH_BINARY                          CV_THRESH_BINARY_INV

    上述结果是当adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C的;

    当adaptive_method=CV_ADAPTIVE_THRESH_GAUSSIAN_C时,结果为:

                                      src                                                   CV_THRESH_BINARY                CV_THRESH_BINARY_INV

    到此图像二值化介绍告一段落,迎大家留言讨论,如有兴趣一起学习图像处理、计算机视觉、深度学习相关领域欢迎关注号,一起学习进步,

    可以微信搜索“图像处理CV讲武堂”关注,也可如下二维扫码关注。

    展开全文
  • opencv学习--opencv实现图像二值化

    万次阅读 2018-08-01 16:53:11
    图像二值化操作在图像处理中有着巨大的作用,主要介绍全局二值化 threshold和局部二值化方法 参考文章:https://blog.csdn.net/u011574296/article/details/72829925  ...

            图像二值化操作在图像处理中有着巨大的作用,主要介绍全局二值化 threshold和局部二值化方法

    参考文章:https://blog.csdn.net/u011574296/article/details/72829925

                     https://blog.csdn.net/u013270326/article/details/72897507

           图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。灰度处理后就能够二值化了,这是方便图像处理的重要步骤,对轮廓有要求的很有效。

            在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。

           OpenCV提供了全局固定阈值局部自适应阈值的函数来实现二值化图像。 
      全局二值化方法(Global Binariztion Method)对每一幅图计算一个单一的阀值。灰度级大于阈值的像素被标记为背景色,否则为前景。 
      局部二值化方法(Local Adaptive Binarization Method)以像素的邻域的信息为基础来计算每一个像素的阈值。其中一些方法还会计算整个图像中的一个阈值面。如果图像中的一个像素(x,y)的灰度级高于在(x,y)点的阈值面的计算值,那么把像素(x,y)标记为背景,否则为前景字符。

     

    一、 全局二值化方法 threshold

          全局二值化方法 threshold 方法,主要是通过遍历灰度图中点,将图像信息二值化,处理过后的图片只有二种色值。主要介绍全局二值化。

    cvThreshold( const CvArr*  src, CvArr*  dst,
                                double  threshold, double  max_value,
                                int threshold_type );

    1、参数设置

    第一个参数,InputArray类型的src,输入数组,填单通道 , 8或32位浮点类型的Mat即可。
    第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放输出结果,且和第一个参数中的Mat变量有一样的尺寸和类型。
    第三个参数,double类型的thresh,阈值的具体值。
    第四个参数,double类型的maxval,当第五个参数阈值类型type取 THRESH_BINARY 或THRESH_BINARY_INV阈值类型时的最大值.
    第五个参数,int类型的type,阈值类型,。
    其它参数很好理解,我们来看看第五个参数,第五参数有以下几种类型
    0: THRESH_BINARY  当前点值大于阈值时,取Maxval,也就是第四个参数,下面再不说明,否则设置为0
    1: THRESH_BINARY_INV 当前点值大于阈值时,设置为0,否则设置为Maxval
    2: THRESH_TRUNC 当前点值大于阈值时,设置为阈值,否则不改变
    3: THRESH_TOZERO 当前点值大于阈值时,不改变,否则设置为0
    4: THRESH_TOZERO_INV  当前点值大于阈值时,设置为0,否则不改变

    注这是opencv2版本五个参数值,opencv3已经有8个参数值,包括OTSU,如下

    当时用thresh_otsu或thresh_triangle,函数确定最优阈值使用Otsu(大津法)或三角形算法,而不是指定的阈值。函数返回Otsu或三角形算法计算得到的阈值。目前,使用大津法和三角法,输入必须为单通道8位的图像。

    2、opencv实现

    #include <opencv2/core/core.hpp>  
    #include<opencv2/highgui/highgui.hpp>  
    #include"opencv2/imgproc/imgproc.hpp"  
    #include <iostream>  
     
    using namespace cv;
    Mat SrcImage;
    Mat GrayImage;
    Mat BinaryImage;
     
    void on_trackbar(int pos,void*)
    {
    	//转化为二值图
    	threshold(GrayImage, BinaryImage, pos, 255, CV_THRESH_BINARY);
    	namedWindow("二值图");
    	imshow("二值图", BinaryImage);
    }
     
    void to_GrayImage()
    {
    	//创建与原图同类型和同大小的矩阵
    	GrayImage.create(SrcImage.size(), SrcImage.type());
    	//将原图转换为灰度图像
    	cvtColor(SrcImage, GrayImage, CV_BGR2GRAY);
     
    	namedWindow("灰度图");
    	imshow("灰度图", GrayImage);
    	
    }
     
     
    void creat_trackbar()
    {
    	int nThreshold = 0;
    	createTrackbar("二值图阈值", "二值图", &nThreshold, 254, on_trackbar);
     
    }
     
    int main()
    {
    	SrcImage = imread("102.jpg");
    	namedWindow("原图");
    	imshow("原图", SrcImage);
    	to_GrayImage();
    	on_trackbar(1, 0);
    	creat_trackbar();
    	waitKey();
    }
    

    二、 局部二值化方法  adaptiveThreshold( )

    double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)

    1.参数说明:

      src:单通道的输入图像 
      dst:和输入图像同类型的输出图像 
      maxValue: 二值化后非零的最大值设置,二值,顾名思义有两个值,一个是零,一个是(0~256)之间的值。具体和阈值类型搭配说明见下面。 
      adaptiveMethod:自适应阈值算法选择:CV_ADAPTIVE_THRESH_MEAN_C 或CV_ADAPTIVE_THRESH_GAUSSIAN_C。具体说明见下面。 
      thresholdType:阈值类型,下面有详细选择说明。注意,adaptiveThreshold方法只支持前两个参数 
      blockSize:用来计算每个像素的阈值的邻域大小,如3,5,7等。 
      C:从adaptiveMethod选择的方法中计算出来的平均值或加权平均值减去的参数值,可以是正数或负数。区别C方式函数,没有默认值。

     

    2. opencv实现

    与全局阈值法一致,更改对应函数即可。

     

    展开全文
  • 图像二值化原理 二值化方法:全局阈值,局部阈值 具体原理见上面链接 图像二值化实现 全局阈值 通常情况,我们一般不知道设定怎样的阈值thresh才能得到比较好的二值化效果,只能去试。如对于一幅双峰图像(理解为...

    基础版笔记链接:
    python3+opencv学习笔记汇总目录(适合基础入门学习)
    进阶版笔记目录链接:
    python+opencv进阶版学习笔记目录(适合有一定基础)

    基础版二值化讲解
    opencv学习笔记10:阈值分割

    图像二值化原理

    二值化方法:全局阈值,局部阈值
    具体原理见上面链接

    图像二值化实现

    1.全局阈值
    通常情况,我们一般不知道设定怎样的阈值thresh才能得到比较好的二值化效果,只能去试。如对于一幅双峰图像(理解为图像直方图中存在两个峰),我们指定的阈值应尽量在两个峰之间的峰谷。这时,就可以用第四个参数THRESH_OTSU,它对一幅双峰图像自动根据其直方图计算出合适的阈值(对于非双峰图,这种方法得到的结果可能不理想)。

    对于双峰图,我们需要多传入一个参数cv2.THRESH_OTSU,并且把阈值thresh设为0,设置为其他数也默认为0,算法会找到最优阈值,并作为第一个返回值ret返回。

    cv2.THRESH_BINARY:二进制阈值。把亮的处理成白色,暗的处理成黑色

    cv2.THRESH_BINARY_INV:反二进制阈值。把亮的处理成黑色,暗的处理成白色
    cv2.THRESH_TRUNC:截断阈值。亮的不能太亮,有上限,暗的不变
    cv2.THRESH_TOZERO_INV:threshold 反阈值化为0,把比较亮的部分处理成0成黑色,小于等于阈值的像素点不变
    cv2.THRESH_TOZERO:threshold 阈值化为0,比较亮的部分不变,比较暗的部分处理成黑色为0

    import cv2 as cv
    import numpy as np
    
    def threshold_demo(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY|cv.THRESH_OTSU)
        print("threshold value %s"%ret)
        cv.imshow("binary", binary)
    
    print("--------- Python OpenCV Tutorial ---------")
    src = cv.imread("duoren.jpg")
    cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
    cv.imshow("input image", src)
    threshold_demo(src)
    cv.waitKey(0)
    cv.destroyAllWindows()
    

    图像直方图

    该图没有明显两个波峰,将就用

    结果

    二进制阈值

    修改cv.THRESH_BINARY为其他参数。结果如下

    cv2.THRESH_BINARY_INV:反二进制阈值

    cv2.THRESH_TRUNC:截断阈值

    cv2.THRESH_TOZERO_INV: 反阈值化为0

    cv2.THRESH_TOZERO:阈值化为0

    2.局部阈值 自适应阈值
    cv2.adaptiveThreshold()

    ADAPTIVE_THRESH_MEAN_C :把图像分成一个个小的区域,每个区域做阈值处理,每个区域阈值为这个区域的均值减去常量c,大于阈值取白色,小于取黑色。整个图像有很多阈值。

    ADAPTIVE_THRESH_GAUSSIAN_C:把图像分成一个个小的区域,阈值是每个区域均值的权重和(均值分布为高斯分布,越接近中心均值权重越高)再减去常量c,整个图像只有一个阈值
    blocksize:区域大小,必须是奇数。
    C: 二值化时,如何一个像素点减去均值大于C,才把这个点设为白色,能减弱噪声影响。等于说阈值=均值-C

    在这里插入图片描述

    import cv2 as cv
    import numpy as np
    
    
    def local_threshold(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)
        cv.imshow("binary", binary)
    print("--------- Python OpenCV Tutorial ---------")
    src = cv.imread("duoren.jpg")
    cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
    cv.imshow("input image", src)
    local_threshold(src)
    cv.waitKey(0)
    cv.destroyAllWindows()
    

    换一张经典图
    自适应阈值结果

    全局阈值结果

    首先还是自适应阈值吧。

    3.自定义阈值
    自己实现一个二值化处理

    import cv2 as cv
    import numpy as np
    
    def custom_threshold(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)#转换为灰度图
        h, w = gray.shape[:2]#高宽
        m = np.reshape(gray, [1, w*h])#将图像转换为1维数组,1行多列
        mean = m.sum() / (w*h)#求均值,把均值作为阈值
        print("mean : ", mean)
        ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
        cv.imshow("binary", binary)
    
    print("--------- Python OpenCV Tutorial ---------")
    src = cv.imread("duoren.jpg")
    cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
    cv.imshow("input image", src)
    custom_threshold(src)
    cv.waitKey(0)
    cv.destroyAllWindows()
    
    

    超大图像二值化

    方法:图像分块,再分别阈值
    图超大时,由于光照不能很好分布全图,所以有很多噪声。

    import cv2 as cv
    import numpy as np
    
    def big_image_binary(image):
        print(image.shape)#(1200, 1920, 3)
        cw = 256#每个小块宽
        ch = 256#每个小块高
        h, w = image.shape[:2]#整个图像高,宽
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)#转灰度图
        for row in range(0, h, ch):#遍历每一小块高
            for col in range(0, w, cw):#遍历每一块宽
                roi = gray[row:row+ch, col:cw+col]#小块区域
                #print(np.std(roi), np.mean(roi))#打印小块方差,均值
                dev = np.std(roi)
                if dev < 15:
                    gray[row:row + ch, col:cw + col] = 255#去除空白区域的噪点
                else:
                    #全局阈值
                    ret, dst = cv.threshold(roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)#cv.THRESH_OTSU自动寻找阈值
                    #自适应阈值
                    #dst = cv.adaptiveThreshold(roi, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)
                    gray[row:row + ch, col:cw + col] = dst#在原图上替换小块二值化结果
        #cv.imwrite("result_binary.png", gray)
        cv.imshow('result_binary',gray)
    print("--------- Python OpenCV Tutorial ---------")
    src = cv.imread("limi.jpg")
    cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
    cv.imshow("input image", src)
    big_image_binary(src)
    cv.waitKey(0)
    cv.destroyAllWindows()
    

    说明
    下面代码是去除图像空白小块区域噪声。如果一个小块没有其他东西,那么它的方差就很小,去除一些小黑点(去噪)

    if dev < 15:
                    gray[row:row + ch, col:cw + col] = 255#去除空白区域的噪点
    

    电气专业的计算机萌新,写博文不容易。如果你觉得本文对你有用,请点个赞支持下。谢谢。

    展开全文
  • OpenCV图像二值化

    2019-01-21 15:22:06
    一、什么是二值图像 ...二、图像二值化 1、获取阈值 2、根据阈值去二值化图像方法 三、全局阈值 1、函数 threshold函数(固定阈值门限分割) (1)OpenC的threshold函数进行全局阈值。 thre...

    OpenCV—图像二值化



    一:什么是二值图像

    彩色图像:三个通道0- 255, 0- 255, 0- 255,所以可以有2^ 24位空间

    灰度图像:一个通道0-255,所以有256种颜色

    二值图像:只有两种颜色,黑和白,1白色,0黑色

    二:图像二值化

    (一)先获取阈值

    (二)根据阈值去二值化图像

    (三)OpenCV中的二值化方法

    (四)补充阈值类型

    原灰度图像的像素值

    1.THRESH_BINARY:过门限的值为最大值,其他值为0

    2.THRESH_BINARY_INV:过门限的值为0,其他值为最大值

    3.THRESH_TRUNC:过门限的值为门限值,其他值不变

     

    4.THRESH_TOZERO:过门限的值不变,其他设置为0

    5.THRESH_TOZERO_INV:过门限的值为0,其他不变

    三:代码实现全局阈值

    (一)全局阈值使用THRESH_OTSU大津法

    def threshold_demo(image):
        gray = cv.cvtColor(image,cv.COLOR_RGB2GRAY)   #要二值化图像,要先进行灰度化处理
        ret, binary = cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)
        print("threshold value: %s"%ret)  #打印阈值,前面先进行了灰度处理0-255,我们使用该阈值进行处理,低于该阈值的图像部分全为黑,高于该阈值则为白色
        cv.imshow("binary",binary)  #显示二值化图像
    

    threshold value: 140.0  #获取的阈值是140

    (二)全局阈值使用THRESH_TRIANGLE(三角形算法)

    ret, binary = cv.threshold(gray, 0, 255,cv.THRESH_BINARY | cv.THRESH_TRIANGLE)

    threshold value: 67.0

    (三)上面使用大津法和三角形算法都是自动去获取阈值,下面我们自己直接指定阈值

    (1)THRESH_BINARY_INV大于阈值的都为0

    ret, binary = cv.threshold(gray, 127, 255,cv.THRESH_BINARY_INV)

    threshold value: 127.0

     (2)THRESH_TRUNC截断大于127的值都为127

    ret, binary = cv.threshold(gray, 127, 255,cv.THRESH_TRUNC)

    (3)THRESH_TOZERO小于阈值的都为0和(1)相反

    ret, binary = cv.threshold(gray, 127, 255,cv.THRESH_TOZERO)

    相关知识补充

    (1)threshold方法

    ①OpenC的threshold函数进行全局阈值。其函数原型为:threshold(src, thresh, maxval, type[, dst]) -> retval, dst src参数表示输入图像(多通道,8位或32位浮点)。 thresh参数表示阈值。 maxval参数表示与THRESH_BINARY和THRESH_BINARY_INV阈值类型一起使用设置的最大值。 type参数表示阈值类型。 retval参数表示返回的阈值。若是全局固定阈值算法,则返回thresh参数值。若是全局自适应阈值算法,则返回自适应计算得出的合适阈值。 dst参数表示输出与src相同大小和类型以及相同通道数的图像。 ②type参数阈值类型这部分参考博客:https: // blog.csdn.net/iracer/article/details/49232703 ,写的很不错。

     (2)cv.THRESH_OTSU类型

    推文:OTSU算法

    cv2.threshold函数是有两个返回值的,

    第一个返回值,得到图像的阈值, 第二个返回值,也就是阈值处理后的图像,
    cv.threshold(gray, 0, 255,cv.THRESH_BINARY | cv.THRESH_OTSU)  #这是我们自己设置的
    我们自己不一定能够找到一个最好的阈值,去二分化图像,所以我们需要算法自己去寻找一个阈值,而cv.THRESH_OTSU就可以满足这个需求,去找到一个最好的阈值。
    注意:他非常适用于图像灰度直方图具有双峰的情况,他会在双峰之间找到一个值作为阈值,对于非双峰图像,可能并不是很好用。
    因为cv.THRESH_OTSU方法会产生一个阈值,那么函数cv2.threshold的的第二个参数(设置阈值)就是0(None)了,并且在cv2.threshold的方法参数中还得加上语句cv2.THRESH_OTSU。
    这里面第三个参数maxval参数表示与THRESH_BINARY和THRESH_BINARY_INV阈值类型一起使用设置的最大值。 而我们使用的灰度图像最大则为255,所以设置为255即可

    (3)cv.THRESH_TRIANGLE类型(有丢失)适用于单个波峰

    推文:图像处理之三角法图像二值化

    THRESH_OTSU flag, use Otsu algorithm to choose the optimal threshold value THRESH_TRIANGLE flag, use Triangle algorithm to choose the optimal threshold value
    ret, binary = cv.threshold(gray, 0, 255,cv.THRESH_BINARY | cv.THRESH_TRIANGLE)

    (4)cv.THRESH_OTSU类型和cv.THRESH_TRIANGLE类型

    THRESH_OTSU和THRESH_TRIANGLE和前面的说到的二值化方法组合使用, 好处是不用自己指定thresh值,系统会进行计算并且作为返回值返回。
    区别是:
    THRESH_OTSU最适用于双波峰
    THRESH_TRIANGLE最适用于单个波峰,最开始用于医学分割细胞等

    四:代码实现局部阈值(更加清晰)

    (一)ADAPTIVE_THRESH_MEAN_C

    def local_threshold(image):
        gray = cv.cvtColor(image,cv.COLOR_RGB2GRAY)   #要二值化图像,要先进行灰度化处理
        dst = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,25,10)
        cv.imshow("local_threshold", dst)
    

     (二)ADAPTIVE_THRESH_GAUSSIAN_C轮廓更加清晰

    dst = cv.adaptiveThreshold(gray, 255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY, 25, 10)

    相关知识补充

    (1)adaptiveThreshold方法

    def adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None): # real signature unknown; restored from __doc__
    OpenCV的adaptiveThreshold函数进行局部阈值。函数原型为:adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst

    src参数表示输入图像(8位单通道图像)。

    maxValue参数表示使用 THRESH_BINARY 和 THRESH_BINARY_INV 的最大值.

    adaptiveMethod参数表示自适应阈值算法平均 (ADAPTIVE_THRESH_MEAN_C)或高斯(ADAPTIVE_THRESH_GAUSSIAN_C)。

    thresholdType参数表示阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV的阈值类型。

    blockSize参数表示块大小(奇数且大于1,比如3,5,7… )。

    C参数是常数,表示从平均值或加权平均值中减去的数。 通常情况下,这是正值,但也可能为零或负值。

    在使用平均和高斯两种算法情况下,通过计算每个像素周围blockSize x blockSize大小像素块的加权均值并减去常量C即可得到自适应阈值。
    如果使用平均的方法,则所有像素周围的权值相同;
    如果使用高斯的方法,则每个像素周围像素的权值则根据其到中心点的距离通过高斯方程得到。

    五:全局和局部的比较

     六:自己计算阈值

    def custom_threshold(image):
        gray = cv.cvtColor(image,cv.COLOR_RGB2GRAY)   #要二值化图像,要先进行灰度化处理
        h,w=gray.shape[:2]  #求宽高
        m = np.reshape(gray,[1,w*h])  #将图像转一维数组,一行,w*h列,转换维度要保证其size不变
        mean = m.sum() / (w*h)  #求平均值来当做阈值,来分割图像
        print("mean :",mean)
        ret,binary = cv.threshold(gray,mean,255,cv.THRESH_BINARY)
        cv.imshow("binary",binary)
    

     

    相关知识补充:

    (1)reshape方法

    def reshape(a, newshape, order='C'):
    

    numpy的reshape函数是给数组一个新的形状而不改变其数据,函数原型:reshape(a, newshape, order=‘C’)

    a参数表示需要重新形成的原始数组。

    newshape参数表示int或int类型元组(tuple),若为(1, 3),表示生成的新数组是1行3列。

    order参数表表示使用此索引顺序读取a的元素,并使用此索引顺序将元素放置到重新形成的数组中。

    函数返回值:如果可能的话,这将是一个新的视图对象; 否则,它会成为副本。

    注意:将图像转一维数组,转换维度要保证其size不变,newshape==》[行,列]一行n列,要保证其容量大小不变

     

    展开全文
  • OpenCV图像二值化

    热门讨论 2012-12-05 10:41:27
    《【OpenCV入门指南】第四篇 图像二值化》http://blog.csdn.net/morewindows/article/details/8239678 的配套程序,可以动态调整二值化的阈值,以便更好观察二值化效果。
  • (三)OpenCV图像二值化

    千次阅读 2018-12-29 10:24:52
    1 图像灰度 1.0 Demo import cv2 def grayImage(sourceDir): img = cv2.imread(sourceDir) cv2.imshow(&quot;Source Image&quot;, img) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2....
  • OpenCV+C++ 实现图像的两种LBPH图
  • opencv python 图像二值化/简单阈值化/大津阈值法 参考:https://segmentfault.com/a/1190000015647247 1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的...
  • Opencv:图像二值化与去噪Python实现

    千次阅读 2019-11-12 09:38:32
    图像二值化与去噪 一、内容 对于一张需要二值化的图像,我们有一般有两种选择 选择一 直接对输入图像转换为灰度图像,然后二值化 选择二 首先对输入图像进行降噪,去除噪声干扰,然后再二值化 在进行去噪声的...
  • OPENCV图像二值化

    2015-01-25 14:11:46
    利用opencv函数库将选取图片二值化,配合进度条进行调节
  • opencv java图像二值化处理

    千次阅读 2018-08-26 02:17:04
    1.threshold方法: Imgproc.threshold(Mat src, Mat dst, double thresh, double maxval, ...dst 输入图像 thresh 当前阈值 maxval 最大阈值一般为255 type 阈值类型 2.adaptiveThreshold Imgproc.adapt...
  • OpenCV图像二值化实例.

    2014-08-23 15:07:39
    先前进行图像二值化处理时都是通过windows.h 中api进行编程,现在用Opencv二值化图像更简单
  • 这里主要实现的 opencv 基于 android 对图像进行常用处理,比如说灰度化,二值化,rgb的转换,这里就不贴主要代码,只是工具代码。Utils.xxx方法的使用需要在MainActivity.class中添加此方法(好像是掉用opencv,...
  • Python - OpenCV 图像二值化处理

    千次阅读 2020-11-21 16:35:46
    图像二值化处理时图像处理过程中非常常见的一种操作,在python中比较常用的主要是opencv,pil两个第三库,对比来看的话,opencv使用要更加的方便灵活, 文本主要介绍以下基于opencv图像二值化处理方法。 首相我们...
  • opencv 图像阈值 二值化处理

    千次阅读 2020-11-27 14:54:29
    文章目录图像阈值threshold 函数阈值...二值化处理目前只支持8位单通道图像。 也可以用于消除噪声(即滤除过小或过大的像素)。 threshold 函数 CV_EXPORTS_W double threshold( InputArray src, OutputArray dst, d
  • python+opencv 图像二值化

    千次阅读 2020-02-02 20:14:31
    OpenCV图像二值化方法:1、OTSU 2、Triangle 3、自动与手动 4、自适应阈值 import cv2 as cv import numpy as np # 根据选定的方法自动寻找阈值 def threshold_demo(image): # 灰度图像 gray = cv.cv...
  • 主要介绍了opencv python如何实现图像二值化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Python OpenCV 图像处理二值化,取经之旅第 7 天

    万次阅读 多人点赞 2020-12-30 21:33:13
    二值化操作竟然还没有学完~
  • 简介:图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。 普通图像二值化 代码如下: import cv2 as cv import numpy as np #全局阈值 def threshold_demo(image...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,629
精华内容 14,651
关键字:

opencv超大图像二值化