opencv 最大类间方差(大津法OTSU)

    xiaoxiao2021-03-25  126

    参考:

    otsu (大津算法):http://baike.baidu.com/link?url=mvcFw6K8H3ko-un4dibuDifmdU9u_skxLryut9OrHs_5V2GdIPVF5jssQe1msMhwTX78guD3P7ufhrNt4gSytq

    #########################################################################

    最近在做字符识别,看了很多资料,发现在对图像进行预处理过程中,对图像进行二值化是一个必不可少的方式。如何才能有效的将目标字符表现出来,OpenCV提供的阈值化方法有threshold和adaptiveThreshold,但这需要自己进行参数调整。在同学那里了解到一个很有效的方法,就是大津法(OTSU)。

    OTSU算法就是一种对于图像进行二值化的高效算法。它是基于最大类间方法法原理。

    百度百科上有较详细的讲解,有兴趣的可以查看一下。

    我在使用过程中发现效果确实不错,能够有效的区分出前景和背景

    ##########################################################################

    实验:使用以下照片,解析出字符

    注:该图像由网上获取

    C++:

    [cpp]  view plain  copy   #include <iostream>   #include <opencv2/opencv.hpp>   using namespace std;   using namespace cv;      int main(int argc, char* argv[])   {       Mat img = imread(argv[1], -1);       if (img.empty())       {           cout <<"Error: Could not load image" <<endl;           return 0;       }          Mat gray;       cvtColor(img, gray, CV_BGR2GRAY);          Mat dst;       threshold(gray, dst, 0, 255, CV_THRESH_OTSU);          imshow("src", img);       imshow("gray", gray);       imshow("dst", dst);       waitKey(0);          return 0;   }  

    Python:

    [python]  view plain  copy   #!/usr/bin/env python   #-*- coding: utf-8 -*-      """  实现大津法  """      __author__ = 'zj'      import cv2   import os   import time      if __name__ == '__main__':       img = cv2.imread("te.png", -1)       if img == None:           print "Error: Could not load image"           os._exit(0)              gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)              time0 = time.time()       retval, dst = cv2.threshold(gray, 0255, cv2.THRESH_OTSU)       time1 = time.time()       total = (time1 - time0)       print "otsu need time: %.3f s"%total          cv2.imshow("src", img)       cv2.imshow("gray", gray)       cv2.imshow("dst", dst)       cv2.waitKey(0)  

    有人写了一个Python模块Mahotas,同样可以实现OTSU算法

    mahotas介绍:

    http://www.open-open.com/news/view/6c916f

    http://www.oschina.NET/p/mahotas/

    C语言:

    [cpp]  view plain  copy   #include <cv.h>   #include <highgui.h>   #include <stdio.h>      int main(int argc, char* argv[])   {       IplImage *img = cvLoadImage("te.png", -1);       if (img == NULL)        {           printf("Error: Could not load image\n");           return 0;       }          IplImage *gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);       cvCvtColor(img, gray, CV_BGR2GRAY);          IplImage *dst = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);       cvThreshold(gray, dst, 0, 255, CV_THRESH_OTSU);          cvNamedWindow("src");       cvNamedWindow("gray");       cvNamedWindow("dst");          cvShowImage("src", img);       cvShowImage("gray", gray);       cvShowImage("dst", dst);              cvWaitKey(0);          return 0;   }  

    另参:http://blog.csdn.net/augusdi/article/details/9012043

    转载请注明原文地址: https://ju.6miu.com/read-11577.html

    最新回复(0)