matlab直方图阈值分割法

matlab直方图阈值分割法,第1张

接下来:

[m n]=size(I)

I1=zeros(m,n)

for i=1:m

for j=1:n

if I(i,j)>t1

I1(i,j)=1

else

I1(i,j)=0

end

end

end

subplot(2,3,3)imshow(I1)

我给你提供2种方法,一种是直方图阈值法一种是最大类间方差

直方图阈值法

用 MATLAB实现直方图阈值法:

I=imread(' c4.jpg ')

I1=rgb2gray(I)

figure

subplot(2,2,1)

imshow(I1)

title(' 灰度图像')

axis([50,250,50,200])

grid on %显示网格线

axis on %显示坐标系

[m,n]=size(I1) %测量图像尺寸参数

GP=zeros(1,256) %预创建存放灰度出现概率的向量

for k=0:255

GP(k+1)=length(find(I1==k))/(m*n) %计算每级灰度出现的概率,将其存入GP中相应位置

end

subplot(2,2,2),bar(0:255,GP,'g') %绘制直方图

title('灰度直方图')

xlabel('灰度值')

ylabel(' 出现概率')

I2=im2bw(I,150/255)

subplot(2,2,3),imshow(I2)

title('阈值150的分割图像')

axis([50,250,50,200])

grid on %显示网格线

axis on %显示坐标系

I3=im2bw(I,200/255) %

subplot(2,2,4),imshow(I3)

title('阈值200的分割图像')

axis([50,250,50,200])

grid on %显示网格线

axis on %显示坐标系

自动阈值法:Otsu法

用MATLAB实现Otsu算法:

clc

clear all

I=imread(' c4.jpg ')

subplot(1,2,1),imshow(I)

title('原始图像')

axis([50,250,50,200])

grid on %显示网格线

axis on %显示坐标系

level=graythresh(I)%确定灰度阈值

BW=im2bw(I,level)

subplot(1,2,2),imshow(BW)

title('Otsu 法阈值分割图像')

axis([50,250,50,200])

grid on %显示网格线

axis on %显示坐标系

OTSU算法又叫最大类间方差阈值分割算法,也叫大津算法(大津展之 Ōtsu Nobuyuki),主要用于一些简单的阈值确定。

对于下面这张灰度图片:

我们想让这些物体(前景)和背景区分更明显一些,比如让物体为纯黑,背景全白。那么我们就需要找到一个合适的阈值,使图片上灰度值大于这个阈值的像素点为255(白色),灰度值小于阈值的像素点为0(黑色)。也就是变成下面这幅图:

怎样确定这个阈值呢?OTSU算法说,我们可以求出用这个阈值分割后的两个图像对应pixel的类间方差。对于每一个可能的阈值,我们计算并取出类间方差最大的那个像素pixel值,此时这个值就可以较好的对图像进行分割。

对应直方图如下:

1、将灰度值区间为[0,m],对于[0,m]间的每一个灰度t,将它作为阈值将图像分割为灰度为[0,t]以及[t+1,m]两部分。

2、计算每一部分的所占比例 , ,每一部分的平均灰度值 , ,以及总的平均灰度值 。

3、计算他们的类间方差:

4、取出类间方差最大时对应的阈值t,这就可以作为我们最终所取的阈值。

小伙伴们如果觉得文章还行的请点个赞呦!!同时觉得文章哪里有问题的可以评论一下 谢谢你!


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

原文地址: http://outofmemory.cn/yw/8117442.html

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

发表评论

登录后才能评论

评论列表(0条)

保存