‘壹’ 简单阈值法和Otsu算法的根本区别是什么
区别如下:
Niblack算法是通过某一像素点及其邻域内像素点灰度值的均值和标准差计算得到二值化阈值的。在计算图像点(x,y)二值化阈值时,首先计算以(x,y)为中心的n*n大小的区域内像素点的灰度均值m和标准差s。灰度均值m和标准差s的计算公式如下:
然后根据灰度均值和标准差计算得到点(x,y)的二值化阈值T,计算公式为T(x,y)=k*s(x,y)+m(x,y),其中k为修正系数。最后根据计算得到的阈值T对该点进行二值化处理。将图像中所有的像素点按照此方法处理即可得到二值化图像。
虽然能够实现图像的二值化,但是如果选取的区域均为背景点时,该算法会将灰度值较高的点当做是目标点,导致伪噪声的引入(针对伪噪声引入的问题,产生了Sauvola算法)。此处说明一下Sauvola算法。Sauvola算法可以说是一种改进的Niblack算法。首先也是按照上文所述方式求取灰度均值和标准差,但是采用了不同的阈值选取方法。
‘贰’ 图像分割中的otsu算法 有原理介绍么我在网上搜的论文都是改进啊或者研究什么的 没有最基础的算法介绍
这个算法很简单,是个日本人70年代写的论文,你看看能不能搜到。具体的就是遍历灰度0-255,选择一个灰度值,使他们的类间距最大,图像中掺着一些模式识别的概念,我想看看ostu的公式就能懂了吧,没有这么复杂。
‘叁’ 基于改进的 OSTU 算法OLED 显示面板缺陷检测系统
Development of OLED Panel Defect Detect System through Improved Otsu Algorithm
OLED 已经逐渐变成新一代的显示设备。视角广、画质均匀、响应快、低能耗,并且能做成柔性显示屏都是他的优点。他也广泛应用到MP3、MP4,手机,数码相机,移动终端等领域。OLED 的复杂制造工艺不可避免的引入各种缺陷,例如: blemish Defect 、 line Defect 和 Mura Defect 。这些缺陷影响 OLED 的光线均匀性,图像清晰度和生产周期。因此开发一套快速高精度的 OLED 在线缺陷监测系统来保证产品质量变得非常重要。
最近几年,基于机器视觉的光学检测在电子装备领域得到了个更多的关注。图像分割和带通滤波技术已经被应用到表片缺陷检测,例如,电路板印刷表面缺陷、TFT-LCD缺陷检测。TFT-LCD 缺陷检测算法主要应用于频域空间和空域空间。SHK 等人证明 OLED 缺陷显示屏由周期性纹理背景和缺陷组成。在频域空间,缺陷响应频域中的高频部分,周期性背景纹理响应低频部分。高通滤波器能够滤掉周期性背景纹理,留下高频部分的缺陷信息。该方法的创新在于用了一个平滑窗口函数代替了频域的滤波。平滑图像和原始图像差分,获得有缺陷的图像。但是该方法的问题在于:周期性的背景纹理边缘也在高频响应,高通滤波和差分操作纹理边缘也保留下来了。这些纹理边缘也被视作缺陷,因而影响了检测结果的准确率。
S.Fan 等人想出了一个回归诊断的TFT-LCD缺陷检测方法。他们假设良品是光照一致,亮度均匀,缺陷显品局部亮度、对比度和背景不一致。该方法首先将屏幕分成许多子块,并计算每一块的平均灰度值,灰度均值代替该区块值,该背景块和原始图像块差分。通过残差分析判断差分图像是否包含缺陷块。虽然该方法能实现缺陷自动检测,但是时间复杂度比较高,并且残差分析判断参数需要手动校准。TSAI 设计了一个基于一维傅里叶变换的图像重建算法,该方法对明显的纹理图片有很好的效果。Lu 等人提出了一种基于独立成分分析ICA的缺陷检测方法。Zhang 等人设计基于多项式表面拟合的算法,该方法能有效检测复杂背景中的 Blemish Defect 。在特征提取领域,这些方法关注目标的对比度,面积,尺寸,位置,轮廓,形状和亮度均匀性,然后建立 Blemish Defect 模型。然而,该方法有不确定性,每个特征的权重是很难确定的。实验结果表明有一定程度的不确定性。因此,在 TFT-LCD 屏幕缺陷检测领域存在一些有用的方法,但是不存在一个能解决所有类型缺陷的通用方法。该算法由于时间复杂度太高,不适合快速工业生产检测。
OLED 和 TFT-LCD显示屏在微观层面有一些不同。主要在于:OLED 像素有三个独立的子像素组成,三个子像仅仅显示的发光材料不同,其它都一致。子像素和电路被整齐的排列在显示屏上。OLED 和 TFT-LCD 在微观结构是不相同的,因此在图像显示方面有一些特别。复杂的制造程序使得屏幕包含发光异常的缺陷。这些缺陷来自环境或者生产程序包括尘埃和外部因素。该文献提出的块扫描检测系统,目的在于解决OLED 显示屏中的多种缺陷。
OLED 屏幕缺陷检测系统结构如图2,该检测系统包括 CCD 相机,运动控制卡,采集卡,XY 运动平台,光源和其它周边设备。运动控制卡驱动控制 XY 运动平台,以便我们能够用镜头扫描 OLED 获得图像。CCD 相机通过图像采集卡获取图像到电脑,通过电脑完成图像处理和缺陷识别。对捕获的OLED显示像素的图像的代表性样品如图3所示。
缺陷检测系统基本方法论:从获取的图像中用细化技术提取 OLED 显示屏的骨架;然后,骨架图像和原始图像差分获得一个理想的模板图像。通过改进的Otsu 算法获取一个理想的分割阈值。通过二值图像识别缺陷。
在本文,通过图像的细化技术提取 OLED 图像的骨架信息,初始角点信息可以通过定位符" + "获得。通过投影的骨架图像的过程生成完整的控制点图,以确定初始角点分布,找到正确的距离,并添加丢失角点。生成图像用来和标准模板图像差分。骨架信息是一个几何图形的拓扑描述。骨架是一个线性几何,并被放置在图像的对称中心,和初始图像一样的拓扑结构,并保留初始形状。该方法被广泛运用在计算机视觉、生物形状描述、模式识别、工业检测、和图像压缩领域。
‘肆’ otsu阈值分割算法是什么
Otsu算法:最大类间方差法(大津算法),是一种确定阈值的算法。
之所以称为最大类间方差法是因为,用该阈值进行的图像固定阈值二值化,类间方差最大,它是按图像的灰度特性,将图像分成背景和前景两部分,使类间方差最大的分割意味着错分概率最小。
算法评价:
优点:算法简单,当目标与背景的面积相差不大时,能够有效地对图像进行分割。
缺点:当图像中的目标与背景的面积相差很大时,表现为直方图没有明显的双峰,或者两个峰的大小相差很大,分割效果不佳,或者目标与背景的灰度有较大的重叠时也不能准确的将目标与背景分开。
‘伍’ otsu算法同时有几个最大类间分差的解决办法
OTSU-最大类间方差是由日本学者大津(OTSU)于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。 KSW 双阈值方法1985年Kapur,Sahoo和Wong(三个人)提出一种最佳熵自动门限法,在此简称KSW 方法
‘陆’ otsu法和threshold有什么区别
盲猜是图像二值化处理的问题。
首先说结论:otsu法和threshold并不是一类东西,没法说有什么区别。otsu法是得出threshold的一个算法。
一个灰度图像,每个像素的灰度值都是一个字节,8位,也就是0~255。数越大颜色越浅,越小颜色越深,0是黑色,255是白色。
二值化图像也就是只有黑和白两种颜色,一般情况下0是黑,1是白。
将灰度图进行二值化处理时也就需要一个阈值,也就是threshold。小于这个阈值的数为0,这个点为黑色;大于这个阈值的数为1,这个点为白色。
所以图像二值化最根本的问题就在于怎么去选择这个阈值。
最简单的办法就是设定一个固定值,这是运算速度最快也是最弱智的方法。显然这种方法对环境光的要求比较高,如果整体环境的明暗发生变化,那么对设定的阈值也要重新整定。
所以需要找到一种能够自动计算出阈值的算法。这种算法有很多,OTSU法是其中用的比较多的一个方法。
OTSU法,中文叫大津法,是由日本学者大津展之提出的,因此以他的名字命名。大津法的根本思想是,首先通过聚类的方法将图像的灰度值分为前景和背景两类,再穷举所有像素点的灰度值,并计算出一个阈值使得类间方差最大,这样这个阈值就是一个理想的二值化阈值。大津法能够很好的适应图像的明暗度和对比度的变化。
大津法的具体算法可以参考这篇文章:网页链接
‘柒’ MATLAB--数字图像处理 Otsu算法(双阈值)
该算法就是利用otsu算法计算出两个阈值
公式
g=w0 (u0-u)^2+w1 (u1-u) ^2+ w2*(u2-u) ^2
g最大值时,就可以选出两个阈值
求两个阈值
利用这两个阈值分割图像
主函数调用
‘捌’ 什么是三帧差分法
三帧差分算法是相邻两帧差分算法的一种改进方法,它选取连续三帧视频图像进行差分运算,消除由于运动而显露背景影响,从而提取精确的运动目标轮廓信息。该算法的基本原理是是先选取视频图像序列中连续三帧图像并分别计算相邻两帧的差分图像,然后将差分图像通过选取适当的阈值进行二值化处理,得到二值化图像,最后在每一个像素点得到的二值图像进行逻辑与运算,获取共同部分,从而获得运动目标的轮廓信息。
三帧差法的具体算法如下。
提取连续的三帧图像,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;
}
‘玖’ 阈值分割的OTSU算法
OTSU算法又叫最大类间方差阈值分割算法,也叫大津算法(大津展之 Ōtsu Nobuyuki),主要用于一些简单的阈值确定。
对于下面这张灰度图片:
我们想让这些物体(前景)和背景区分更明显一些,比如让物体为纯黑,背景全白。那么我们就需要找到一个合适的阈值,使图片上灰度值大于这个阈值的像素点为255(白色),灰度值小于阈值的像素点为0(黑色)。也就是变成下面这幅图:
怎样确定这个阈值呢?OTSU算法说,我们可以求出用这个阈值分割后的两个图像对应pixel的类间方差。对于每一个可能的阈值,我们计算并取出类间方差最大的那个像素pixel值,此时这个值就可以较好的对图像进行分割。
对应直方图如下:
1、将灰度值区间为[0,m],对于[0,m]间的每一个灰度t,将它作为阈值将图像分割为灰度为[0,t]以及[t+1,m]两部分。
2、计算每一部分的所占比例 , ,每一部分的平均灰度值 , ,以及总的平均灰度值 。
3、计算他们的类间方差:
4、取出类间方差最大时对应的阈值t,这就可以作为我们最终所取的阈值。
小伙伴们如果觉得文章还行的请点个赞呦!!同时觉得文章哪里有问题的可以评论一下 谢谢你!