数字图像处理 关于Otsu法选择最大化类间方差的阈值k ()

数字图像处理 关于Otsu法选择最大化类间方差的阈值k (),第1张

k的0~255循环求得每一个对应的fc=w0(u0-ut)^2+w1(u1-ut)^2;然后比较这256个fc中的最大值,对应的那个k就是ostu的阈值。所以你这个还差一个k的循环,并在循环里面求最大fc。

我这也有段求阈值的,你可以参考下

hist=zeros(256,1);%直方图

%threshold=128; %初始阈值

%计算直方图

for i=1:height

for j=1:width

m=I_gray(i,j)+1;

hist(m)=hist(m)+1;

end

end

hist=hist/(heightwidth);%落在每一灰度级上的概率

avg=0;

for m=1:256

avg=avg+(m-1)hist(m);

end

temp=0;

for i=1:256

p1=0;

avg1=0;

avg2=0;

T_current=i-1;%当前分割阈值

for m=1:T_current-1

p1=hist(m)+ p1;%低灰度级概率总和

end

p2=1-p1;%高灰度级概率总和

for m=1:256

if m<T_current

avg1=avg1+(m-1)hist(m);

else

avg2=avg2+(m-1)hist(m);

end

end

avg1=avg1/p1;

avg2=avg2/p2;

D=p1(avg1-avg)^2+p2(avg2-avg)^2;

if D>=temp

finalT=T_current;

temp=D;

end

end

你是用什么软件对图像进行阈值处理?如果你用的是MATLAB,则可以先把真彩图转化成灰度图,再用graythresh得到大津法的阈值,最后将此阈值代入二值分割。例子如下:

I=imread('真彩图');    %读取真彩图(原图)

J=rgb2gray(I);             %将原图转化成灰度图

level=graythresh(J);            %计算阈值

BW=im2bw(J,level);           %代入阈值进行二值分割

代码写错了

%% 迭代阈值选择法二值化图像与Otsu阈值选择法二值化图像比较

clc;

clear all;

close all;

f=imread('8_256_lenabmp','bmp');

subplot(2,2,1);

subimage(f);title('原始图像');

f=double(f);

T=(min(f(:))+max(f(:)))/2;

done=false;

i=0;

while ~done

r1=find(f<=T);

r2=find(f>T);

Tnew=(mean(f(r1))+mean(f(r2)))/2;

done=abs(Tnew-T)<1;

T=Tnew;

i=i+1;

end

f(r1)=0;

f(r2)=1;

subplot(2,2,2);

subimage(f);title('迭代阈值二值化图像图像');

f=imread('8_256_lenabmp','bmp');

subplot(2,2,3);

subimage(f);title('原始图像');

T=graythresh(f);

g=im2bw(f,T);

subplot(2,2,4);

subimage(g);title('Otsu方法二值化图像');

clear I=imread('baijpg'); %读入图像

q=imadjust(I,[2 3 0;6 7 1],[]); %增强图像的对比度

j=rgb2gray(q); %彩色图像变灰度图像

j1=im2bw(q,230/255);%二值化

se90=strel('line',3,90); %构造元素

se0=strel('line',3,0); %同上

BW2=imdilate(j1,[se90 se0]); % 用构造的元素膨胀

BW3=bwareaopen(BW2,100);%开 *** 作

BW3=~BW3;%取反

BW4=bwareaopen(BW3,20);%开

BW5=bwperim(BW4);%计算BW4周长

[imx,imy]=size(BW5);计算长宽

L=bwlabel(BW5,8);%用不同的数字根据是否连通标记图像,

a=max(max(L));%得到L图像中标记结果的最大值

BW6=bwfill(BW5,'hole');%填充背景

I2=I;

for i=1:3; I2(:,:,i)=I2(:,:,i)uint8(BW6);

end imshow(I2); 有大神能逐条解释一下语句吗,本人是菜鸟啊,跪求!!

阈值将原图象分成前景,背景两个图象。

前景:用n1, csum, m1来表示在当前阈值下的前景的点数,质量矩,平均灰度

后景:用n2, sum-csum, m2来表示在当前阈值下的背景的点数,质量矩,平均灰度

当取最佳阈值时,背景应该与前景差别最大,关键在于如何选择衡量差别的标准

而在otsu算法中这个衡量差别的标准就是最大类间方差(英文简称otsu,这也就是这个算法名字的来源)

在本程序中类间方差用sb表示,最大类间方差用fmax

关于最大类间方差法(otsu)的性能:

类间方差法对噪音和目标大小十分敏感,它仅对类间方差为单峰的图像产生较好的分割效果。

当目标与背景的大小比例悬殊时,类间方差准则函数可能呈现双峰或多峰,此时效果不好,但是类间方差法是用时最少的。

最大最大类间方差法(otsu)的公式推导:

记t为前景与背景的分割阈值,前景点数占图像比例为w0, 平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。

则图像的总平均灰度为:u=w0u0+w1u1。

前景和背景图象的方差:g=w0(u0-u)(u0-u)+w1(u1-u)(u1-u)=w0w1(u0-u1)(u0-u1),此公式为方差公式,可参照概率论课本

上面的g的公式也就是下面程序中的sb的表达式

当方差g最大时,可以认为此时前景和背景差异最大,也就是此时的灰度是最佳阈值

unsafe public int GetThreshValue(Bitmap image)

{

BitmapData bd = imageLockBits(new Rectangle(0, 0, imageWidth, imageHeight), ImageLockModeWriteOnly, imagePixelFormat);

byte pt = (byte)bdScan0;

int[] pixelNum = new int[256]; //图象直方图,共256个点

byte color;

byte pline;

int n, n1, n2;

int total; //total为总和,累计值

double m1, m2, sum, csum, fmax, sb; //sb为类间方差,fmax存储最大方差值

int k, t, q;

int threshValue = 1; // 阈值

int step = 1;

switch (imagePixelFormat)

{

case PixelFormatFormat24bppRgb:

step = 3;

break;

case PixelFormatFormat32bppArgb:

step = 4;

break;

case PixelFormatFormat8bppIndexed:

step = 1;

break;

}

//生成直方图

for (int i = 0; i < imageHeight; i++)

{

pline = pt + i bdStride;

for (int j = 0; j < imageWidth; j++)

{

color = (pline + j step); //返回各个点的颜色,以RGB表示

pixelNum[color]++; //相应的直方图加1

}

}

//直方图平滑化

for (k = 0; k <= 255; k++)

{

total = 0;

for (t = -2; t <= 2; t++) //与附近2个灰度做平滑化,t值应取较小的值

{

q = k + t;

if (q < 0) //越界处理

q = 0;

if (q > 255)

q = 255;

total = total + pixelNum[q]; //total为总和,累计值

}

pixelNum[k] = (int)((float)total / 50 + 05); //平滑化,左边2个+中间1个+右边2个灰度,共5个,所以总和除以5,后面加05是用修正值

}

//求阈值

sum = csum = 00;

n = 0;

//计算总的图象的点数和质量矩,为后面的计算做准备

for (k = 0; k <= 255; k++)

{

sum += (double)k (double)pixelNum[k]; //xf(x)质量矩,也就是每个灰度的值乘以其点数(归一化后为概率),sum为其总和

n += pixelNum[k]; //n为图象总的点数,归一化后就是累积概率

}

fmax = -10; //类间方差sb不可能为负,所以fmax初始值为-1不影响计算的进行

n1 = 0;

for (k = 0; k < 255; k++) //对每个灰度(从0到255)计算一次分割后的类间方差sb

{

n1 += pixelNum[k]; //n1为在当前阈值遍前景图象的点数

if (n1 == 0) { continue; } //没有分出前景后景

n2 = n - n1; //n2为背景图象的点数

if (n2 == 0) { break; } //n2为0表示全部都是后景图象,与n1=0情况类似,之后的遍历不可能使前景点数增加,所以此时可以退出循环

csum += (double)k pixelNum[k]; //前景的“灰度的值其点数”的总和

m1 = csum / n1; //m1为前景的平均灰度

m2 = (sum - csum) / n2; //m2为背景的平均灰度

sb = (double)n1 (double)n2 (m1 - m2) (m1 - m2); //sb为类间方差

if (sb > fmax) //如果算出的类间方差大于前一次算出的类间方差

{

fmax = sb; //fmax始终为最大类间方差(otsu)

threshValue = k; //取最大类间方差时对应的灰度的k就是最佳阈值

}

}

imageUnlockBits(bd);

imageDispose();

return threshValue;

}

主要是三类

1) 基于点的全局阈值方法;

2) 基于区域的全局阈值方法

3) 局部阈值方法和多阈值方法

1)基于点的全局阈值方法

p-分位数法

1962年Doyle提出的p-分位数法是最古老的一种阈值选取方法

迭代方法选取阈值

初始阈值选取为图像的平均灰度T0,然后用T0将图像的象素点分作两部分,计算两部分各自的平均灰度,小于T0的部分为TA,大于T0的部分为TB,将T1 作为新的全局阈值代替T0,重复以上过程,如此迭代,直至TK 收敛

直方图凹面分析法

最大类间方差法

熵方法

最小误差阈值

矩量保持法

模糊集方法

2) 基于区域的全局阈值方法

二维熵阈值分割方法

简单统计法

直方图变化法

松弛法

3) 局部阈值方法和多阈值方法

局部阈值(动态阈值)

阈值插值法

水线阈值算法

多阈值法 基于小波的多域值方法 基于边界点的递归多域值方法 均衡对比度递归多域值方法

以上就是关于数字图像处理 关于Otsu法选择最大化类间方差的阈值k ()全部的内容,包括:数字图像处理 关于Otsu法选择最大化类间方差的阈值k ()、如何对图像进行阈值处理、图像分割matlab程序,运行后,分割结果为全黑,阈值th显示128,这是什么情况请求解答等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10625983.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-10
下一篇2023-05-10

发表评论

登录后才能评论

评论列表(0条)

    保存