查看: 4380|回复: 5

[其他] OTSU算法对图像二值化

[复制链接]

该用户从未签到

1

主题

1

帖子

0

新手上路

Rank: 1

积分
13
最后登录
2016-10-19
发表于 2016-1-8 20:31:53 | 显示全部楼层 |阅读模式
       在飞思卡尔智能车比赛中,对于摄像头组,从摄像头模块中采集到的一副图像,除了硬件二值化,还有自我软件二值化。硬件二值化好处在于方便开发,但是在环境较恶劣的情况下,二值化后的图像可能不好接收。而像OV7620这样输出灰度图的摄像头,我们可以对其做自适应环境的二值化。在二值化中,OTSU,大津法,那可是相当不错,此处为大家奉上转载好帖介绍OTSU及其C语言实现。

       OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法。       1. OTSU算法原理简介       对于一幅图像,设当前景与背景的分割阈值为t时,前景点占图像比例为w0,均值为u0,背景点占图像比例为w1,均值为u1。则整个图像的均值为u = w0*u0+w1*u1。建立目标函数g(t)=w0*(u0-u)^2+w1*(u1-u)^2,g(t)就是当分割阈值为t时的类间方差表达式。OTSU算法使得g(t)取得全局最大值,当g(t)为最大时所对应的t称为最佳阈值。OTSU算法又称为最大类间方差法。       2.OTSU算法例程下面是OSTU算法的C语言代码及其测试,代码基于opencv。
  1. #include <cv.h>  
  2. 2.#include <highgui.h>  
  3. 3.  
  4. 4.int otsu(IplImage *image)  
  5. 5.{  
  6. 6.    assert(NULL != image);  
  7. 7.  
  8. 8.    int width = image->width;  
  9. 9.    int height = image->height;  
  10. 10.    int x=0,y=0;  
  11. 11.    int pixelCount[256];  
  12. 12.    float pixelPro[256];  
  13. 13.    int i, j, pixelSum = width * height, threshold = 0;  
  14. 14.  
  15. 15.    uchar* data = (uchar*)image->imageData;  
  16. 16.  
  17. 17.    //初始化  
  18. 18.    for(i = 0; i < 256; i++)  
  19. 19.    {  
  20. 20.        pixelCount[i] = 0;  
  21. 21.        pixelPro[i] = 0;  
  22. 22.    }  
  23. 23.  
  24. 24.    //统计灰度级中每个像素在整幅图像中的个数  
  25. 25.    for(i = y; i < height; i++)  
  26. 26.    {  
  27. 27.        for(j = x;j <width;j++)  
  28. 28.        {  
  29. 29.            pixelCount[data[i * image->widthStep + j]]++;  
  30. 30.        }  
  31. 31.    }  
  32. 32.  
  33. 33.  
  34. 34.    //计算每个像素在整幅图像中的比例  
  35. 35.    for(i = 0; i < 256; i++)  
  36. 36.    {  
  37. 37.        pixelPro[i] = (float)(pixelCount[i]) / (float)(pixelSum);  
  38. 38.    }  
  39. 39.  
  40. 40.    //经典ostu算法,得到前景和背景的分割  
  41. 41.    //遍历灰度级[0,255],计算出方差最大的灰度值,为最佳阈值  
  42. 42.    float w0, w1, u0tmp, u1tmp, u0, u1, u,deltaTmp, deltaMax = 0;  
  43. 43.    for(i = 0; i < 256; i++)  
  44. 44.    {  
  45. 45.        w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;  
  46. 46.  
  47. 47.        for(j = 0; j < 256; j++)  
  48. 48.        {  
  49. 49.            if(j <= i) //背景部分  
  50. 50.            {  
  51. 51.                //以i为阈值分类,第一类总的概率  
  52. 52.                w0 += pixelPro[j];        
  53. 53.                u0tmp += j * pixelPro[j];  
  54. 54.            }  
  55. 55.            else       //前景部分  
  56. 56.            {  
  57. 57.                //以i为阈值分类,第二类总的概率  
  58. 58.                w1 += pixelPro[j];        
  59. 59.                u1tmp += j * pixelPro[j];  
  60. 60.            }  
  61. 61.        }  
  62. 62.  
  63. 63.        u0 = u0tmp / w0;        //第一类的平均灰度  
  64. 64.        u1 = u1tmp / w1;        //第二类的平均灰度  
  65. 65.        u = u0tmp + u1tmp;      //整幅图像的平均灰度  
  66. 66.        //计算类间方差  
  67. 67.        deltaTmp = w0 * (u0 - u)*(u0 - u) + w1 * (u1 - u)*(u1 - u);  
  68. 68.        //找出最大类间方差以及对应的阈值  
  69. 69.        if(deltaTmp > deltaMax)  
  70. 70.        {     
  71. 71.            deltaMax = deltaTmp;  
  72. 72.            threshold = i;  
  73. 73.        }  
  74. 74.    }  
  75. 75.    //返回最佳阈值;  
  76. 76.    return threshold;  
  77. 77.}  
  78. 78.  
  79. 79.int main(int argc, char* argv[])  
  80. 80.{  
  81. 81.    IplImage* srcImage = cvLoadImage("D:\\technology\\CV\\Database\\image\\rice.png",0);  
  82. 82.    assert(NULL != srcImage);  
  83. 83.  
  84. 84.    cvNamedWindow("src");  
  85. 85.    cvShowImage("src",srcImage);  
  86. 86.  
  87. 87.    IplImage* biImage = cvCreateImage(cvGetSize(srcImage),8,1);  
  88. 88.  
  89. 89.    //计算最佳阈值  
  90. 90.    int threshold = otsu(srcImage);  
  91. 91.    //对图像二值化  
  92. 92.    cvThreshold(srcImage,biImage,threshold,255,CV_THRESH_BINARY);  
  93. 93.  
  94. 94.    cvNamedWindow("binary");  
  95. 95.    cvShowImage("binary",biImage);  
  96. 96.      
  97. 97.    cvWaitKey(0);  
  98. 98.  
  99. 99.    cvReleaseImage(&srcImage);  
  100. 100.    cvReleaseImage(&biImage);  
  101. 101.    cvDestroyWindow("src");  
  102. 102.    cvDestroyWindow("binary");  
  103. 103.  
  104. 104.    return 0;  
  105. 105.}  
复制代码

下面是上述代码的运行结果图片。其中左边为原图像,右边为使用OTSU算法进行二值化后的图像。
我知道答案 目前已有5人回答

评分

参与人数 1NXP金币 +10 收起 理由
小七 + 10 赞一个!

查看全部评分

回复

使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
    发表于 2016-1-9 18:50:02 | 显示全部楼层
    学习了。。。 null - 副本 - 副本 - 副本.png null - 副本 - 副本 (2).png null - 副本 - 副本 (3).png null - 副本 - 副本.png null - 副本 (2) - 副本.png null - 副本 (2).png null - 副本 (3).png null - 副本 (4).png null - 副本.png null.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-24 09:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13126
    最后登录
    2019-1-27
    发表于 2016-1-11 16:46:27 | 显示全部楼层
    谢谢分享~
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
    发表于 2016-2-21 10:09:42 | 显示全部楼层
    处处留心皆学问。。。 null - 副本 - 副本 - 副本.png null - 副本 - 副本 (2).png null - 副本 - 副本 (3).png null - 副本 - 副本.png null - 副本 (2) - 副本.png null - 副本 (2).png null - 副本 (3).png null - 副本 (4).png null - 副本.png null.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    63

    帖子

    0

    注册会员

    Rank: 2

    积分
    175
    最后登录
    1970-1-1
    发表于 2016-3-14 10:31:05 | 显示全部楼层
    mark一下
    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    118

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    366
    最后登录
    2016-6-14
    发表于 2016-3-14 11:20:41 | 显示全部楼层
    以前毕设做的就是基于OTSU的二值化图像处理,呵呵,看着很熟悉
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 12:59 , Processed in 0.103733 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表