迭代阈值法

迭代阈值法通过迭代方法选择阈值 计算方法如下 1 选择灰度图的平均值作为初始阈值 T0 2 计算小于等于 T0 的平均值 T1 和大于 T0 的平均值 T2 3 新的阈值为 T T1 T2 2 4 比较 T 和 T0 若相等 则返回 T 即为迭代阈值 否则 T0 T 重复 1 3

通过迭代方法选择阈值, 计算方法如下:

(1)选择灰度图的平均值作为初始阈值T0 ;

(2)计算小于等于T0的平均值T1, 和大于T0的平均值T2;

(3)新的阈值为T = (T1 + T2)/ 2;

(4)比较T和T0,若相等,则返回T,即为迭代阈值; 否则 T0 = T,重复(1)-(3)

#include"cv.h" #include "highgui.h" int IterationThreshold(CvMat* gray); int main() { IplImage *src = cvLoadImage("flower.jpg",1); const int width = src->width; const int height = src->height; CvMat *gray = cvCreateMat(height, width, CV_8UC1); cvCvtColor(src, gray, CV_BGR2GRAY); int thres = IterationThreshold(gray); cvThreshold(gray, gray, thres, 255, CV_THRESH_BINARY); cvShowImage("SRC", src); cvShowImage("GRAY", gray); cvWaitKey(0); cvCvtColor(gray, src, CV_GRAY2BGR); cvSaveImage("DST.bmp", src); cvReleaseMat(&gray); return 0; } int IterationThreshold(CvMat* gray) { int width = gray->width; int height = gray->height; //直方图统计 int histData[256] = {0}; for(int j = 0; j < height; j ++) { uchar*data = (uchar*)(gray->data.ptr + j * gray->step); for (int i = 0; i < width; i ++) { histData[data[i]]++; } } //求图像的平均灰度值作为初始阈值 int T0 = 0; for (int i = 0; i < 256; i ++) { T0 += i * histData[i]; } T0 /= width * height; //迭代 int T1 = 0, T2 = 0; int num1 = 0, num2 = 0; int T = 0; while (1) { for ( int i = 0; i < T0+1; i ++) { T1 += i * histData[i]; num1 += histData[i]; } if (num1 == 0) continue; for ( int i = T0 + 1; i < 256; i ++) { T2 += i * histData[i]; num2 += histData[i]; } if (num2 == 0) continue; T = (T1 / num1 + T2 / num2) / 2; if ( T == T0 ) break; else T0 = T; } return T; }

源图和效果图如下:

迭代阈值法


迭代阈值法


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177265.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午7:55
下一篇 2026年3月26日 下午7:55


相关推荐

  • TIMER2.0_电磁感应原理

    TIMER2.0_电磁感应原理其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类,而具体的TimerTask需要由你自己来实现,例如这样:Timertimer=newTimer();timer.schedule(newTimerTask(){ publicvoidrun(){ System.out.println(“abc”); }},200

    2025年8月8日
    5
  • 在Deepin系统中通过网络安装与配置GStreamer指南,Deepin系统下GStreamer网络安装与配置指南

    在Deepin系统中通过网络安装与配置GStreamer指南,Deepin系统下GStreamer网络安装与配置指南

    2026年3月14日
    2
  • java fel_Fel实现探秘,兼谈EL

    java fel_Fel实现探秘,兼谈ELFel 是最近 javaeye 比较火的关键词 这是由网友 lotusyu 开发的一个高性能的 EL 从作者给出的数据来看 性能非常优异 跟前段时间温少开源的 SimpleEL 有的一拼 首先要说 这是个好现象 国内的开源项目越来越多 可以看出开发者的水平是越来越高了 比如我最近还看到有人开源的类似 kestel 的轻量级 MQ fqueue 也非常不错 有兴趣可以看下我的分析 fqueue 初步分析 进入正文 本文

    2026年3月19日
    2
  • OpenClaw + 腾讯云 Lighthouse:如何打造一站式 IT 监控大屏?(2026实战版)

    OpenClaw + 腾讯云 Lighthouse:如何打造一站式 IT 监控大屏?(2026实战版)

    2026年3月13日
    2
  • java 调用webservice (asmx) 客户端开发示例

    java 调用webservice (asmx) 客户端开发示例这是本人第一次写博客,其实就是自己做个笔记,也希望能给跟我遇到同样问题的你一点帮助。有不专业的地方敬请指正。    因为最近有个项目要调用webservice接口,之前接触的都是java开发服务端和客户端的接口,开发前服务端一般会给个以http://xxx/services?wsdl地址的文件或者地址。这次对方给我个http://xxxx/service/getinfo.asmx 的

    2022年5月31日
    84
  • PyCharm官网无法访问的解决办法[通俗易懂]

    PyCharm官网无法访问的解决办法[通俗易懂]问题描述  最近在研究pythonweb框架,用的是以前学python的时候用的Pycharm社区版(无力吐槽)。不太好用,就想去下个企业版用用,结果出现这种情况。。。  emmm,检查了网络没问题,换了个浏览器也是无法访问,最后辗转多个论坛发现似乎是因为hosts文件的问题。模糊的记得我好像激活成功教程过这个软件修改了一下hosts文件,改回来就可以访问Pycharm官网了。解决办法  Wi…

    2022年8月26日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号