觉得这篇介绍OTSU方法挺清楚的。自己又加了一些,希望对初学者有帮助哦~

OTSU

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算法又称为最大类间方差法。

OSTU大津法算法思想:

一幅有depth个灰度级,根据每个灰度级t,可以将一幅图分为前景和背景。

前景指所有灰度级低于等于t的像素点,背景指大于t的像素点。

w0指前景像素个数;w1指背景像素个数;u0指前景加权平均,即

temp=0;

for i=1:t

temp=temp+i*hist(i)

end

u0=temp/w0;

其中w0=hist(0)+hist(1)+……+hist(t)

hist指各个灰度级上的像素个数

u1对应是背景加权平均

u对应整幅图的加权平均

u=u0*w0+u1*w1.(*)

大津法的结果指使得g最大的t值:

g=w0*(u0-u)^2+w1*(u1-u)^2=w0*w1*(u1-u0)^2 (代入*式可得)2.matlab提供算法

function [level em] = graythresh(I)

%GRAYTHRESH Global image threshold using Otsu's method.

%   LEVEL = GRAYTHRESH(I) computes a global threshold (LEVEL) that can be

%   used to convert an intensity image to a binary image with IM2BW. LEVEL

%   is a normalized intensity value that lies in the range [0, 1].

%   GRAYTHRESH uses Otsu's method, which chooses the threshold to minimize

%   the intraclass variance of the thresholded black and white pixels.

%

%   [LEVEL EM] = GRAYTHRESH(I) returns effectiveness metric, EM, as the

%   second output argument. It indicates the effectiveness of thresholding

%   of the input image and it is in the range [0, 1]. The lower bound is

%   attainable only by images having a single gray level, and the upper

%   bound is attainable only by two-valued images.

function level = Mygraythresh(I)

%GRAYTHRESH Global image threshold using Otsu's method.

% LEVEL = Mygraythresh(I) computes a global threshold (LEVEL) that can be

% used to convert an intensity image to a binary image with IM2BW. LEVEL

% is a normalized intensity value that lies in the range [0, 1].

% GRAYTHRESH uses Otsu's method, which chooses the threshold to minimize

% the intraclass variance of the thresholded black and white pixels.

%

% Example

% -------

% I = imread('coins.png');

% level = Mygraythresh(I);

% BW = im2bw(I,level);

% figure, imshow(BW)

%

% See also IM2BW.

%I=rgb2gray(I);

I=im2uint8(I(:));

depth=256;

counts=imhist(I,depth);

w=cumsum(counts);

ut=counts .* (1:depth)';

u=cumsum(ut);

MAX=0;

level=0;

for t=1:depth

u0=u(t,1)/w(t,1);

u1=(u(depth,1)-u(t,1))/(w(depth,1)-w(t,1));

w0=w(t,1);

w1=w(depth,1)-w0;

g=w0*w1*(u1-u0)*(u1-u0);

if g > MAX

MAX=g;

level = t;

end

end

level=level/256;

3.OTSU算法例程-C

下面是OSTU算法的C语言代码及其测试,代码基于opencv。

#include

#include

int otsu(IplImage *image)

{

assert(NULL != image);

int width = image->width;

int height = image->height;

int x=0,y=0;

int pixelCount[256];

float pixelPro[256];

int i, j, pixelSum = width * height, threshold = 0;

uchar* data = (uchar*)image->imageData;

//初始化

for(i = 0; i < 256; i++)

{

pixelCount[i] = 0;

pixelPro[i] = 0;

}

//统计灰度级中每个像素在整幅图像中的个数

for(i = y; i < height; i++)

{

for(j = x;j

{

pixelCount[data[i * image->widthStep + j]]++;

}

}

//计算每个像素在整幅图像中的比例

for(i = 0; i < 256; i++)

{

pixelPro[i] = (float)(pixelCount[i]) / (float)(pixelSum);

}

//经典ostu算法,得到前景和背景的分割

//遍历灰度级[0,255],计算出方差最大的灰度值,为最佳阈值

float w0, w1, u0tmp, u1tmp, u0, u1, u,deltaTmp, deltaMax = 0;

for(i = 0; i < 256; i++)

{

w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;

for(j = 0; j < 256; j++)

{

if(j <= i) //背景部分

{

//以i为阈值分类,第一类总的概率

w0 += pixelPro[j];

u0tmp += j * pixelPro[j];

}

else //前景部分

{

//以i为阈值分类,第二类总的概率

w1 += pixelPro[j];

u1tmp += j * pixelPro[j];

}

}

u0 = u0tmp / w0;//第一类的平均灰度

u1 = u1tmp / w1;//第二类的平均灰度

u = u0tmp + u1tmp;//整幅图像的平均灰度

//计算类间方差

deltaTmp = w0 * (u0 - u)*(u0 - u) + w1 * (u1 - u)*(u1 - u);

//找出最大类间方差以及对应的阈值

if(deltaTmp > deltaMax)

{

deltaMax = deltaTmp;

threshold = i;

}

}

//返回最佳阈值;

return threshold;

}

int main(int argc, char* argv[])

{

IplImage* srcImage = cvLoadImage("D:\\technology\\CV\\Database\\image\\rice.png",0);

assert(NULL != srcImage);

cvNamedWindow("src");

cvShowImage("src",srcImage);

IplImage* biImage = cvCreateImage(cvGetSize(srcImage),8,1);

//计算最佳阈值

int threshold = otsu(srcImage);

//对图像二值化

cvThreshold(srcImage,biImage,threshold,255,CV_THRESH_BINARY);

cvNamedWindow("binary");

cvShowImage("binary",biImage);

cvWaitKey(0);

cvReleaseImage(&srcImage);

cvReleaseImage(&biImage);

cvDestroyWindow("src");

cvDestroyWindow("binary");

return 0;

}

下面是上述代码的运行结果图片。其中左边为原图像,右边为使用OTSU算法进行二值化后的图像。

otus阈值分割matlab,OSTU最佳阈值法二值化原理-matlab和C | 学步园相关推荐

  1. ostu阈值分割python实现_opencv python 图像二值化/简单阈值化/大津阈值法

    1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表示如果像素值大于(有时小于)阈值则要给出的值. ...

  2. OSTU大律法二值化原理

    介绍 Ostu方法又名最大类间差方法,通过统计整个图像的直方图特性来实现全局阈值T的自动选取,其算法步骤为: 1) 先计算图像的直方图,即将图像所有的像素点按照0~255共256个bin,统计落在每个 ...

  3. OpenCV大津法二值化

    OpenCV大津法二值化 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化 ...

  4. 设图像为 f=[1 5 25 10 20 20] 谷峰法 二值化 图像分割

    峰谷法 二值化 图像分割 峰谷法主要是在找谷底(Th),也就是阈值 先做道例题 画出灰度直方图,找到两个谷底Th1.Th2 用图片测试一下 clear clc f=imread('1.jpg'); f ...

  5. opencv学习日志12-大津法二值化

    前言 这篇文章中主要讲述opencv中如何使用大津法对图像进行二值化操作. 一.大津法二值化 //第三题 大津法二值化 #include <opencv2/opencv.hpp> #inc ...

  6. 基于阈值的图像二值化方法MATLAB

    文章目录 一.目录 二.摘要 三.实验步骤 3.1 固定阈值法 (1)计算均值和方差 (2)绘制和分析高斯分布图像 (3)以128为阈值进行固定阈值分割 (4)观察灰度直方图选择最优固定阈值 3.2 ...

  7. 利用OpenCV的threshold函数实现双阈值法二值化操作的源码

    直接上源码吧,很简单,一看就懂,如果你不明白,可以举两个灰度值实际代入进行理解! 源码如下: 源码中用到的图像的下载链接为:hand1.jpg_免费高速下载|百度网盘-分享无限制 图像处理开发需求.图 ...

  8. 二值图填充原理 matlab,图像Ostu二值化原理及matlab实现代码

    Ostu假设图像是由前景区域和背景区域两部分组成的,通过遍历计算不同阈值(通常为[0 255]区间范围内)下分割结果中前景区域和背景区域的灰度直方图,然后比较两者之间的方差,使得方差最大化的那个灰度阈 ...

  9. Matlab:干涉条纹骨化算法|二值化|滤波|去毛刺

    干涉条纹原图(像素1024×1024,点击放大-右键"图片另存为"到桌面-文件名存为"1.bmp"):  干涉条纹骨化的结果.依次经过:二值化处理→滤波去噪→骨 ...

最新文章

  1. fpga数据位宽截取_FPGA信号截位策略研究
  2. import static
  3. re.search()用法详解
  4. Service Mesh:调度千军万马微服务,2.0妥妥的
  5. Nginx负载均衡与配置Nginx的ssl
  6. Docker 最佳实践
  7. stateflow错误:Error in port widths or dimensions.
  8. RPi 树莓派 DSI 接口研究 MIPI raspberry pi
  9. 一种简单的不需要查询UI5文档就能获得所有API的小技巧
  10. os引导程序boot从扇区拷贝os加载程序loader文件到内存(boot copy kernel to mem in the same method)
  11. HTML的图片标签image的图片地址
  12. 技术转管理,用什么来拯救自己?
  13. 高精度矢量汉字的一种填充方法_惯导解算数学基础4(等效旋转矢量解,圆锥补偿解)...
  14. Unity物理投射相关问题整理
  15. 国内专业移动广告聚合平台,KeyMob,手机广告效果最棒
  16. [转]使用T4模板批量生成代码
  17. Ubuntu Amarok乱码解决方案
  18. 详解测试开发工程师六大能力模型
  19. 2012年7月份第2周51Aspx源码发布详情
  20. python_opencv_haze加雾处理

热门文章

  1. 未来计算机有的特点和能力,未来的计算机具有什么特点
  2. 怎么控制PowerPoint里的Flash歌曲播放
  3. 09年房地产全行业零利润或亏损
  4. 【实验报告】实验一 简单类的设计与应用
  5. 百钱买百鸡问题java_Java版百钱买百鸡
  6. 单片机中绝对地址的访问 CBYTE
  7. 计算机ms高级应用科目一 科目二考什么,学车考什么?科目一、科目二、科目三、科目四,全部都在这!...
  8. Spring3 -- IOC容器的基本原理 02
  9. (附源码)springboot球鞋文化交流论坛 毕业设计 141436
  10. java收到邮件后短信提醒_java邮件发送和短信发送(一)