otus阈值分割matlab,OSTU最佳阈值法二值化原理-matlab和C | 学步园
觉得这篇介绍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 | 学步园相关推荐
- ostu阈值分割python实现_opencv python 图像二值化/简单阈值化/大津阈值法
1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表示如果像素值大于(有时小于)阈值则要给出的值. ...
- OSTU大律法二值化原理
介绍 Ostu方法又名最大类间差方法,通过统计整个图像的直方图特性来实现全局阈值T的自动选取,其算法步骤为: 1) 先计算图像的直方图,即将图像所有的像素点按照0~255共256个bin,统计落在每个 ...
- OpenCV大津法二值化
OpenCV大津法二值化 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化 ...
- 设图像为 f=[1 5 25 10 20 20] 谷峰法 二值化 图像分割
峰谷法 二值化 图像分割 峰谷法主要是在找谷底(Th),也就是阈值 先做道例题 画出灰度直方图,找到两个谷底Th1.Th2 用图片测试一下 clear clc f=imread('1.jpg'); f ...
- opencv学习日志12-大津法二值化
前言 这篇文章中主要讲述opencv中如何使用大津法对图像进行二值化操作. 一.大津法二值化 //第三题 大津法二值化 #include <opencv2/opencv.hpp> #inc ...
- 基于阈值的图像二值化方法MATLAB
文章目录 一.目录 二.摘要 三.实验步骤 3.1 固定阈值法 (1)计算均值和方差 (2)绘制和分析高斯分布图像 (3)以128为阈值进行固定阈值分割 (4)观察灰度直方图选择最优固定阈值 3.2 ...
- 利用OpenCV的threshold函数实现双阈值法二值化操作的源码
直接上源码吧,很简单,一看就懂,如果你不明白,可以举两个灰度值实际代入进行理解! 源码如下: 源码中用到的图像的下载链接为:hand1.jpg_免费高速下载|百度网盘-分享无限制 图像处理开发需求.图 ...
- 二值图填充原理 matlab,图像Ostu二值化原理及matlab实现代码
Ostu假设图像是由前景区域和背景区域两部分组成的,通过遍历计算不同阈值(通常为[0 255]区间范围内)下分割结果中前景区域和背景区域的灰度直方图,然后比较两者之间的方差,使得方差最大化的那个灰度阈 ...
- Matlab:干涉条纹骨化算法|二值化|滤波|去毛刺
干涉条纹原图(像素1024×1024,点击放大-右键"图片另存为"到桌面-文件名存为"1.bmp"): 干涉条纹骨化的结果.依次经过:二值化处理→滤波去噪→骨 ...
最新文章
- fpga数据位宽截取_FPGA信号截位策略研究
- import static
- re.search()用法详解
- Service Mesh:调度千军万马微服务,2.0妥妥的
- Nginx负载均衡与配置Nginx的ssl
- Docker 最佳实践
- stateflow错误:Error in port widths or dimensions.
- RPi 树莓派 DSI 接口研究 MIPI raspberry pi
- 一种简单的不需要查询UI5文档就能获得所有API的小技巧
- os引导程序boot从扇区拷贝os加载程序loader文件到内存(boot copy kernel to mem in the same method)
- HTML的图片标签image的图片地址
- 技术转管理,用什么来拯救自己?
- 高精度矢量汉字的一种填充方法_惯导解算数学基础4(等效旋转矢量解,圆锥补偿解)...
- Unity物理投射相关问题整理
- 国内专业移动广告聚合平台,KeyMob,手机广告效果最棒
- [转]使用T4模板批量生成代码
- Ubuntu Amarok乱码解决方案
- 详解测试开发工程师六大能力模型
- 2012年7月份第2周51Aspx源码发布详情
- python_opencv_haze加雾处理
热门文章
- 未来计算机有的特点和能力,未来的计算机具有什么特点
- 怎么控制PowerPoint里的Flash歌曲播放
- 09年房地产全行业零利润或亏损
- 【实验报告】实验一 简单类的设计与应用
- 百钱买百鸡问题java_Java版百钱买百鸡
- 单片机中绝对地址的访问 CBYTE
- 计算机ms高级应用科目一 科目二考什么,学车考什么?科目一、科目二、科目三、科目四,全部都在这!...
- Spring3 -- IOC容器的基本原理 02
- (附源码)springboot球鞋文化交流论坛 毕业设计 141436
- java收到邮件后短信提醒_java邮件发送和短信发送(一)