demo:图像处理matlab实现迭代法全局阈值分割和局部自适应阈值分割

demo:图像处理matlab实现迭代法全局阈值分割和局部⾃适应阈值分割全局阈值分割
迭代法阈值获取⽅法:
1)选取⼀个的初始估计值T(128);
2)⽤T分割图像。这样便会⽣成两组像素集合:G1由所有灰度值⼤于T的像素组成,⽽G2由所有灰度值⼩于或等于T的像素组成。3)对G1和G2中所有像素计算平均灰度值u1和u2。
4)计算新的阈值:T=1/2(u1 + u2)。
重复步骤(2)到(4),直到得到的T值之差⼩于⼀个事先定义的参数T0。
先导进来图⽚
I = imread('rice.png');
江苏文惠网[width,height] = size(I);
T0 = 1;%设置门限
T1= 128; %初始阈值T1
%设置G1,G2两个列向量,各⾃统计<T和>T的值
gray_leval_1 = 1;
gray_leval_2 = 1;
matlab⾥没有do-while语句,所以⽤
while 1
break
代替
while 1
for i = 1:width
for j = 1:height
if I(i,j)>T1
G1(gray_leval_1) = I(i,j); %得到分组G1
gray_leval_1 = gray_leval_1 + 1;
else
G2(gray_leval_2) = I(i,j); %得到分组G2
gray_leval_2 = gray_leval_2 + 1;
end
end
end
%计算G1、G2均值
avg1 = mean(G1);
avg2 = mean(G2);
T2 = (avg1 + avg2)/2;
if abs(T2 - T1)<T0
break;
end
T1 = T2;
gray_leval_1 = 1;
gray_leval_2 = 1;
end
T1
神舟hp860
T1=uint8(T1);
T1=130.7
然后画出来
for i=1:width
for j=1:height
if(I(i,j)<T1)
BW1(i,j)=0;
else
BW1(i,j)=1;
end
end
end
系船柱
subplot(1,3,1);imshow(I)
subplot(1,3,2);imshow(BW1);title('阈值分割');
matlab⾃带的Otus阈值分割⽅法
T3=graythresh(I)
BW2=imbinarize(I,T3);%Otus阈值分割
subplot(1,3,3);imshow(BW2);title('Otus阈值分割');
I=130.9,差不多哈。
万苏林30r结果
这个阈值分割⽅法存在偏差,如果两个峰值数⽬相差越多,偏差越⼤
(假设第⼀次迭代前,T在正确位置,很容易看出来,随着迭代进⾏,越来越偏离)
计算的T=93,⽬测值应该在110-120吧。
多说⼀句,图像处理,⼀定要double⼀下,否则可能出现问题。⽐如,我想把⼤⽶图的直⽅图暗部拉⼤(偏向0),以体现这种偏差,就⽤了个⼀次函数的变换,结果这样了
因为先乘k,结果>255的全归于255,以后全错。
⾃适应阈值分割
1)将整幅图像分成⼀系列互相之间有50%重叠的⼦图像;
2)做出每个⼦图像的直⽅图;
3)检测各个⼦图像的直⽅图是否为双峰,如果是,则采⽤最佳阈值法确定⼀个阈值,否则就不进⾏处理;
4)根据对直⽅图为双峰的⼦图像得到的阈值通过插值得到所有⼦图像(像素点)的阈值。
仨坑
1、怎么割图像啊(这个还好吧,也不算割,设置好步长来就⾏了)
2、怎么检测单峰还是双峰啊,单峰的话,空缺imresize是不⾏的。
3、怎么插值啊(主要是⽼师上课讲的太⽞学,按照距离加权,四点平均,把相距很远的点内部全部插满,听懵了。后来想到,matlab直接imresize啊!然后就码下来啦)
1、分割⽅式设置好矩形⼤⼩和步长就⾏
2、峰值个数没写,matlab统计⼯具箱⾥好像有正态拟合图像,⽽不是plot()这种拟合,plot拟合只是画的圆滑了些还是很多局部峰值
3、插值⽅式采⽤了imresize函数
A=imresize(I,2,‘nearest’);%最近邻插值
B=imresize(I,2,‘bilinear’);%双线性
C=imresize(I,2,‘bicubic’);%双三次
I=imread('rice.png');
T=zeros(15);
for i=0:14
for j=0:14
img = imcrop(I,[1+i*16 1+j*16 31 31]);%内核32*32,步长设置为16
t=255*graythresh(img);%我这⾥直接⽤了
T(j+1,i+1)=t;%这⾥注意坐标顺序反着北京语言大学bbs
end
end
T=uint8(T);
T1=imresize(T,[256 256],'bilinear');%看了下貌似双线性插值最好
%%
noetvfor i=1:256
for j=1:256
if (I(i,j)<T1(i,j))
BW(i,j)=0;
else
BW(i,j)=1;
end
end
end
imshow(BW)
有⼀个地⽅要注意,图像[i,j],矩阵得是[j,i]。
阈值图像:
底部更暗,所以阈值也更低才能滤完整
阈值分割结果
嗯,上部噪声少了,下部也更完整了
然后试了下博客的图⽚
这⽼哥跑的OPENCV中⾃带的函数,效果⼀级棒(怎么看着像边缘检测)
我这个…毕竟没字的地⽅有⿊背景有⽩背景,⼀加权,也没法搞,不过还阔以吧
matlab中⾃带的阈值分割,对⼤⽶图还⾏。全局阈值分割底部⼤⽶都割残了,这个⽅法完整,可是,这跟局部有关系?貌似先调了调灰度,就好分割了

本文发布于:2024-09-22 22:18:50,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/75059.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:阈值   分割   图像   全局
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议