原文:/weixin_41721222/article/details/80207909
Otsu算法:取一个最优阈值把原图像分为前景色(A部分)与背景色(B部分),两部分的类间方差越大,说明两部分差别越大,便能有效的分割图像。所以该算法最关键的是找到最优阈值。
方差: 例如 1,2,3,4,5
先求均值:1/5(1+2+3+4+5)=3
方差=1/5[(1-3)^2+(2-3)^2+(3-3)^2+(4-3)^2+(5-3)^2]=
(上式能把1/5分别带入相乘)
类间方差:与方差相似,求不同部分之间的方差
例如1,2,3,4,5。把1,2,3当成一个A部分,4,5当成B部分,由方差可知,需要得到总均值,A部分所有比例,B部分所占比例,A部分值(即均值),B部分值(即均值)
PA(A比例)=3/5 PB(B比例)=2/5
ave_all(总均值)=3 ave_A(A均值)=1/3(1+2+3) ave_B(B均值)=1/2(4+5)
类间方差=PA*(ave_A-ave_all)^2+PB*(ave_B-ave_all)^2(Otsu算法)
公式代码如下:
close;clear;clc;I=im2double(imread('coins.png')); %变为双精度,即0-1subplot(221);imhist(I);%显示灰度直方图[M,N]=size(I); %得到图像行列像素number_all=M*N;%总像素值hui_all=0; %预设图像总灰度值为0ICV_t=0; %预设最大方差为0%得到图像总灰度值for i=1:Mfor j=1:Nhui_all=hui_all+I(i,j);endendall_ave=hui_all*255/number_all; %图像灰度值的总平均值%t为某个阈值,把原图像分为A部分(每个像素值>=t)与B部分(每个像素值<t)for t=0:255 %不断试探最优t值hui_A=0; %不断重置A部分总灰度值hui_B=0; %不断重置B部分总灰度值number_A=0;%不断重置A部分总像素number_B=0;%不断重置B部分总像素for i=1:M %遍历原图像每个像素的灰度值for j=1:Nif (I(i,j)*255>=t) %分割出灰度值》=t的像素number_A=number_A+1; %得到A部分总像素hui_A=hui_A+I(i,j); %得到A部分总灰度值elseif (I(i,j)*255<t) %分割出灰度值《t的像素number_B=number_B+1; %得到B部分总像素hui_B=hui_B+I(i,j); %得到B部分总灰度值endendendPA=number_A/number_all;%得到A部分像素总数与图像总像素的比列PB=number_B/number_all;%得到B部分像素总数与图像总像素的比列A_ave=hui_A*255/number_A;%得到A部分总灰度值与A部分总像素的比例B_ave=hui_B*255/number_B;%得到B部分总灰度值与B部分总像素的比例ICV=PA*((A_ave-all_ave)^2)+PB*((B_ave-all_ave)^2); %Otsu算法if (ICV>ICV_t) %不断判断,得到最大方差ICV_t=ICV;k=t; %得到最大方差的最优阈值endendk %显示阈值
在MATLAB中自带Otsu算法,调用即可
k=graythresh(I) %I为灰度图像。k为最优阈值,其大小在[0,1]之间 ,为双精度类型
代码如下:
close;clear;clc;I=im2double(imread('coins.png'));k=graythresh(I); %得到最优阈值J=im2bw(I,k); %转换成二值图,k为分割阈值subplot(121);imshow(I);subplot(122);imshow(J);
---------------------