博客:http://blog.rare0716.cn图像分割:把图像空间分成一些有意义的区域,与图像中各种物体目标相对应。
图像分割技术分类运算方法并行边界技术
串行边界技术
并行区域技术
串行区域技术结构分割方法边缘分割法
阈值分割法
基于区域的分割
阈值分割法
基本原理
原始图像f(x,y)
灰度阈值T
阈值运算的二值图像g(x,y)
全局阈值是最简单的图像分割方法。原理:假定物体和背景分别处于不同灰度级,图像的灰度分布曲线近似用两个正态分布概率密度函数分别代表目标和背景的直方图,出现两个分离的峰值。
依据最小误差理论等准则求出两个峰间的波谷,其灰度值即分割的阈值。
最大类间方法差-大津法
设定一个阈值k,将图像分成两组。
变动k的取值使得两组的类间方差最大,此时该值K为所求分割阈值。
迭代法
选取初始图像灰度值T,把原始图像中全部像素分成前景、背景两大类。
分别对其进行积分并将结果取平均以获取一新的阈值,并按此阈值将图像分成前景、背景。
如此反复迭代下去,当阈值不再发生变化,即迭代已经收敛于某个稳定的阈值时,此刻的阈值即作为最终的结果并用于图像的分割。
具体算法
大津法
微信公众好屏蔽超链接点不开可以复制下面网址再打开
https://blog.csdn.net/qq_29462849/article/details/81022607
代码
大津法function [newImg,g] = otsu(img)
%OTSU 此处显示有关此函数的摘要
% 此处显示详细说明 返回newImg,g,newImg为二值化的图像,g为阈值
p=zeros(256,1);
w0=zeros(256,1);
w1=zeros(256,1);
u0=zeros(256,1);
u1=zeros(256,1);
u=zeros(256,1);
result=zeros(256,1);
imgSize=size(img);
M=imgSize(1);
N=imgSize(2);
if numel(imgSize)~=2
img=rgb2gray(img);
end
for t=1:256
grayScale=t-1;
x=find(img==grayScale);
p(t)=length(x)/(M*N);
end
for t=1:256
w0(t)=sum(p(1:t));
w1(t)=sum(p(t+1:256));
u0(t)=0;
for i=1:t
u0(t)=u0(t)+(i-1)*p(i)/w0(t);
end
u1(t)=0;
for i=t+1:256
u1(t)=u1(t)+(i-1)*p(i)/w1(t);
end
u(t)=w0(t)*u0(t)+w1(t)*u1(t);
result(t)=w0(t)*(u0(t)-u(t))^2+w1(t)*(u1(t)-u(t))^2;
end
[~,g]=max(result);
newImg=binaryImg(img,g);
%imshow(newImg);
end
迭代法function [newImg,g] = iter(img)
%ITERATION 此处显示有关此函数的摘要
% 此处显示详细说明
sz=size(img);
M=sz(1);
N=sz(2);
if numel(sz)~=2
img=rgb2gray(img);
end
%maxScale=max(max(img));
%minScale=min(min(img));
%g=uint8((maxScale+minScale)/2);
g=128;%直接取较为简单,但是可能增加迭代次数
while 1
foreCount=0;
foreSum=0;
backCount=0;
backSum=0;
for i=1:M
for j=1:N
if img(i,j)<=g
foreCount=foreCount+1;
foreSum=foreSum+double(img(i,j));
else
backCount=backCount+1;
backSum=backSum+double(img(i,j));
end
end
end
foreAver=foreSum/foreCount;
backAver=backSum/backCount;
newG=uint8(foreAver/2+backAver/2);
if newG==g
break
end
g=newG;
end
newImg=binaryImg(img,g);
%imshow(newImg);
end