当前位置:首页 » 操作系统 » otsu算法的改进

otsu算法的改进

发布时间: 2022-04-11 17:23:13

‘壹’ otsu算法同时有几个最大类间分差的解决办法

OTSU-最大类间方差是由日本学者大津(OTSU)于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。 KSW 双阈值方法1985年Kapur,Sahoo和Wong(三个人)提出一种最佳熵自动门限法,在此简称KSW 方法

‘贰’ otsu阈值分割算法是什么

Otsu算法:最大类间方差法(大津算法),是一种确定阈值的算法。

之所以称为最大类间方差法是因为,用该阈值进行的图像固定阈值二值化,类间方差最大,它是按图像的灰度特性,将图像分成背景和前景两部分,使类间方差最大的分割意味着错分概率最小。

算法评价:

优点:算法简单,当目标与背景的面积相差不大时,能够有效地对图像进行分割。

缺点:当图像中的目标与背景的面积相差很大时,表现为直方图没有明显的双峰,或者两个峰的大小相差很大,分割效果不佳,或者目标与背景的灰度有较大的重叠时也不能准确的将目标与背景分开。

‘叁’ otsu的介绍

OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法。

‘肆’ 【高分】用Matlab实现中值滤波与Otsu算法

告诉你一个简单的方法
你可以edit medfilt2
edit graythresh
就可以得到原函数的详细编码,然后再稍微修改一下就行了呗

‘伍’ 简单阈值法和Otsu算法的根本区别是什么

区别如下:


  1. Niblack算法是通过某一像素点及其邻域内像素点灰度值的均值和标准差计算得到二值化阈值的。在计算图像点(x,y)二值化阈值时,首先计算以(x,y)为中心的n*n大小的区域内像素点的灰度均值m和标准差s。灰度均值m和标准差s的计算公式如下:

  2. 然后根据灰度均值和标准差计算得到点(x,y)的二值化阈值T,计算公式为T(x,y)=k*s(x,y)+m(x,y),其中k为修正系数。最后根据计算得到的阈值T对该点进行二值化处理。将图像中所有的像素点按照此方法处理即可得到二值化图像。

  3. 虽然能够实现图像的二值化,但是如果选取的区域均为背景点时,该算法会将灰度值较高的点当做是目标点,导致伪噪声的引入(针对伪噪声引入的问题,产生了Sauvola算法)。此处说明一下Sauvola算法。Sauvola算法可以说是一种改进的Niblack算法。首先也是按照上文所述方式求取灰度均值和标准差,但是采用了不同的阈值选取方法。

‘陆’ 什么是三帧差分法

三帧差分算法是相邻两帧差分算法的一种改进方法,它选取连续三帧视频图像进行差分运算,消除由于运动而显露背景影响,从而提取精确的运动目标轮廓信息。该算法的基本原理是是先选取视频图像序列中连续三帧图像并分别计算相邻两帧的差分图像,然后将差分图像通过选取适当的阈值进行二值化处理,得到二值化图像,最后在每一个像素点得到的二值图像进行逻辑与运算,获取共同部分,从而获得运动目标的轮廓信息。

三帧差法的具体算法如下。

提取连续的三帧图像,I(k-1),I(k),I(k+1) 。

(1) d(k,k-1) [x,y] = | I(k)[x,y] - I(k-1)[x,y] |;

d(k,k+1)[x,y] = | I(k+1)[x,y] - I(k)[x,y] |;

(2) b(k,k-1)[x,y] = 1; if d(k,k-1) [x,y] >= T;

b(k,k-1)[x,y] = 0; if d(k,k-1) [x,y] < T;

b(k+1,k)[x,y] = 1 if d(k+1,k) [x,y] >= T;

b(k+1,k)[x,y] = 0 if d(k+1,k) [x,y] < T;

(3) B(k)[x,y] = 1 ; if b(k,k-1)[x,y] && b(k+1,k)[x,y] == 1 ;

B(k)[x,y] = 0 ; if b(k,k-1)[x,y] && b(k+1,k)[x,y] ==0 ;

比较关键的就是第2步的阈值T的选取问题,单纯用otsu算法分割貌似效果不太好,如果手动设置一个较小的值(如10)效果还行。

用otsu取阈值实现的一个三分差法代码。效果不是很好。

运行环境 VS2008+OpenCV2.0+windows XP .

[cpp] view plainprint?#include "highgui.h"
#include "cv.h"
#include "cxcore.h"
#include "cvaux.h"
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
#include <windows.h>
using namespace std;

#pragma comment(lib, "highgui200.lib")
#pragma comment(lib, "cv200.lib")
#pragma comment(lib, "cxcore200.lib")
#pragma comment(lib, "cvaux200.lib")

#define GET_IMAGE_DATA(img, x, y) ((uchar*)(img->imageData + img->widthStep * (y)))[x]
int T = 10;
int Num[300];
int Sum[300];

void InitPixel(IplImage * img, int &_low, int &_top)
{
memset(Num,0,sizeof(Num));
memset(Sum,0,sizeof(Sum));
_low = 255;
_top = 0;
for(int i = 0;i < img->height;i++)
{
for(int j = 0;j < img->width;j++)
{
int temp = ((uchar*)(img->imageData + img->widthStep*i))[j];
if(temp < _low)
_low = temp;
if(temp > _top)
_top = temp;
Num[temp] += 1;
}
}
for(int i = 1 ; i < 256 ; i++)
{
Sum[i] = Sum[i-1]+ i*Num[i];
Num[i] += Num[i-1];
}
}
int otsu (IplImage *img)
{
int _low,_top,mbest=0;
float mn = img->height*img->width;
InitPixel(img,_low,_top);
float max_otsu = 0;
mbest = 0;
if( _low == _top)
mbest = _low;
else
{
for(int i = _low; i< _top ; i++)
{
float w0 = (float)((Num[_top]-Num[i]) / mn);
float w1 = 1 - w0;
float u0 = (float)((Sum[_top]-Sum[i])/(Num[_top]-Num[i]));
float u1 = (float)(Sum[i]/Num[i]);
float u = w0*u0 + w1*u1;
float g = w0*(u0 - u)*(u0 - u) + w1*(u1 - u)*(u1 - u);
if( g > max_otsu)
{
mbest = i;
max_otsu = g;
}
}
}
return mbest;
}
int main()
{
int ncount=0;
IplImage *image1=NULL;
IplImage *image2=NULL;
IplImage *image3=NULL;
IplImage *Imask =NULL;
IplImage *Imask1=NULL;
IplImage *Imask2=NULL;
IplImage *Imask3=NULL;
IplImage *mframe=NULL;
CvCapture *capture = cvCreateFileCapture("E:\\Motion\\IndoorGTTest2.avi");
//CvCapture *capture = cvCreateCameraCapture(0);
cvNamedWindow("src");
cvNamedWindow("dst");
cvNamedWindow("Imask1");
cvNamedWindow("Imask2");
cvNamedWindow("Imask3");
//cvCreateTrackbar("T","dst",&T,255,0);
while(mframe=cvQueryFrame(capture))
{
DWORD start=GetTickCount();
if(ncount>1000000000)
ncount=100;
ncount+=1;
if(ncount==1)
{
image1=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
image2=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
image3=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
Imask =cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
Imask1=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
Imask2=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);
Imask3=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);

cvCvtColor(mframe,image1,CV_BGR2GRAY);
}
if(ncount==2)
cvCvtColor(mframe,image2,CV_BGR2GRAY);

if(ncount>=3)
{
if(ncount==3)
cvCvtColor(mframe,image3,CV_BGR2GRAY);
else
{
cvCopy(image2,image1);
cvCopy(image3,image2);
cvCvtColor(mframe,image3,CV_BGR2GRAY);
}

cvAbsDiff(image2,image1,Imask1);
cvAbsDiff(image3,image2,Imask2);

//cvShowImage("Imask1",Imask1);
//cvShowImage("Imask2",Imask2);

int mbest1 = otsu(Imask1);
cvSmooth(Imask1, Imask1, CV_MEDIAN);
cvThreshold(Imask1,Imask1,mbest1, 255, CV_THRESH_BINARY);

int mbest2 = otsu(Imask2);
cvSmooth(Imask2,Imask2, CV_MEDIAN);
cvThreshold(Imask2,Imask2,mbest2, 255, CV_THRESH_BINARY);

cout<<mbest1<<" "<<mbest2<<endl;

cvAnd(Imask1,Imask2,Imask);

/*cvErode(Imask, Imask);
cvDilate(Imask,Imask);*/

DWORD finish=GetTickCount();
// cout<<finish-start<<"ms"<<endl;

cvShowImage("src",image2);
cvShowImage("dst",Imask);
}
char c = cvWaitKey(30);
if(c==27)
break;
}

return 0;
}

‘柒’ 谁可以给出matlab源码啊基于一种改进的Otsu图像阈值分割算法的,一维的。

z++++++++x+x+
+xcccccccccccccc
cd
vvvv+c v

‘捌’ Otsu算法在Canny算子中的应用中,Otsu算法的程序后,要不要再添加在Canny算子的程序

问题一:
OTSU法是二值化图像的算法,经过OTSU处理图像就成了黑白二值图。
CANNY算法是针对灰度图的边缘提取算法。OTSU处理后,不需要再加CANNY处理了。

问题二:
如果图像噪音较大,就需要先做中值滤波,或其它降噪处理。这是图像处理的前处理。做前处理的目的是提高图像质量,然后再做OTSU,效果会好一些。但图像本身就很清晰的话,就不需要加中值滤波了。

通过你的问题,我感觉你还没有透彻理解几个术语的概念。
先想清楚想把什么样的图像处理成什么样的图像,然后根据目的选择处理方法。

如果话说重了,请原谅。

‘玖’ 图像分割中的otsu算法 有原理介绍么我在网上搜的论文都是改进啊或者研究什么的 没有最基础的算法介绍

这个算法很简单,是个日本人70年代写的论文,你看看能不能搜到。具体的就是遍历灰度0-255,选择一个灰度值,使他们的类间距最大,图像中掺着一些模式识别的概念,我想看看ostu的公式就能懂了吧,没有这么复杂。

‘拾’ 如何对不规则图形做基于otsu算法的图像自适应阈值分割

难度不大,
otsu算法的图像自适应阈值分割
我稍微指点你。

热点内容
服务器怎么盈利 发布:2024-05-05 23:56:16 浏览:940
java网站培训学校 发布:2024-05-05 23:43:11 浏览:40
淘宝搜索算法 发布:2024-05-05 23:37:07 浏览:998
sqlwhencasethen 发布:2024-05-05 23:27:51 浏览:641
模架编程软件 发布:2024-05-05 23:26:54 浏览:483
存储过程异常 发布:2024-05-05 23:24:03 浏览:399
winxp访问不了win7 发布:2024-05-05 23:05:23 浏览:734
算法牛 发布:2024-05-05 22:43:40 浏览:720
grublinux引导 发布:2024-05-05 22:37:56 浏览:216
unix高级编程第三版pdf 发布:2024-05-05 22:32:09 浏览:959