
image_1=imread('E:\ebook\lenabmp'); %读入
image_1=rgb2gray(image_1);%灰度化
[m,n]=size(image_1);%计算的像素点个数,行列,n是列数,Gray
num=zeros(1,256);%存放各灰度级出现的次数
p=zeros(1,256);%存放各灰度级的比率
image_1=double(image_1);%双精度化
for i=1:m
for j=1:n
num(image_1(i,j)+1)=num(image_1(i,j)+1)+1;%统计各灰度级的像素点个数
end
end
for i=1:256
p(i)=num(i)/(mn);%计算各灰度级出现的比率
end
for i=2:256
if p(i)~=0
st=i+1;%实现寻找出现比率不为0的最小灰度值
break
end
end
for i=256:-1:1
if p(i)~=0;
nd=i-1;%实现找出出现比率不为0的最大灰度值
break
end
end
%以下程序实现利用最小方差和法找出门阈值
w=inf; th=0;
for t=st:nd%最小非零比率灰度值到最大非零比率灰度值
qt1=0; qt2=0;%前景后景像素点比率
u1=0; u2=0;%前景后景均值
v1=0; v2=0;%
for i=1:t
qt1=qt1+p(i);
end
for i=1:t
u1=u1+ip(i)/qt1;
end
for i=1:t
v1=v1+((i-u1)^2)p(i)/qt1;
end
for i=t+1:256
qt2=qt2+p(i);
end
for i=t+1:256
u2=u2+ip(i)/qt2;
end
for i=t+1:256
v2=v2+((i-u2)^2)p(i)/qt2;
end
if qt1v1+qt2v2<w
th=t; w=qt1v1+qt2v2 ;
end
end
for i=1:m
for j=1:n
if (image_1(i,j)+1>th)
image_2(i,j)=255;
else
image_2(i,j)=0;
end
end
end
image_2=uint8(image_2);%读入读出变换
figure,imshow(image_2);%显示二值化后的
代码写错了
%% 迭代阈值选择法二值化图像与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方法二值化图像');
你需要先知道每一个O占的大小 比如占88个像素 SkipStep=8;%每一个O的大小 和遍历的补偿 M=8; N=8; n=0;%编号 I=imread('jpg'); I=rgb2gray(I);%灰度转化 [H,W]=size(I); xStepNum = floor((W-N)/SkipStep+1);%朝负无穷方向取整 宽度方向block移动的次数 yStepNum = floor((H-M)/SkipStep+1);%朝负无穷方向取整 高度y方向移动的次数 for j=1:xStepNum%一列一列来取的 for m=1:yStepNum n=n+1; PImg=I((m-1)SkipStep+1:(m-1)SkipStep+M,(k-1)SkipStep+1:(k-1)SkipStep+N);%分割图像 y='jpg'; w=strcat(n,'',y); imwrite(PImg,w);%保存分割出来的 格式为jpg 名字为编号n end end 但是这样也把不是O的取出来了,你可以知道没有O的地方的n 你到时候不用即可
% rgb=imread('source1bmp');
% I=rgb2gray(rgb); % 色彩转换成灰度
I=imread('source3bmp');
level= graythresh(I); %得到合适的阈值 得到合适的阈值
bw= im2bw(I,level); %二值化
SE= strel('square',3); %设置膨胀结构元素
BW1= imdilate(bw,SE); % 膨胀
SE1= strel('arbitrary',eye(5)); %设置腐蚀结构元素
BW2= imerode(bw,SE1); %腐蚀
BW3= bwmorph(bw,'open'); %开运算
BW4= bwmorph(bw,'close'); %闭运算
figure(1),
subplot(2,3,1),imshow(I);title('原图');
subplot(2,3,2),imshow(bw);title('二值图');
subplot(2,3,3),imshow(BW1);title('膨胀');
subplot(2,3,4),imshow(BW2);title('腐蚀');
subplot(2,3,5),imshow(BW3);title('开运算');
subplot(2,3,6),imshow(BW4);title('闭运算');
%
figure(2)
BW5 = imfill(bw,'holes');
subplot(121), imshow(bw), title('源图像二值化')
subplot(122), imshow(BW5), title('填充后的图像')
%轮廓提取
figure(3)
contour = bwperim(bw);
imshow(contour);
title('轮廓')
这样的图是没有现成的函数帮你切割出来单个小圆的,我不知道是谁替你想出的这个方法,也不知道你有什么目的,但这绝对是个笨办法,只能靠机械式的数学算法,程序编出来没有适用性,不过如果你要是只针对这一个图我可以给你程序:设原始是im_i,你事先还必须测量出来边缘到第一个圆心的距离设为a1(长边)和b1(短边)以及两圆心之间的距离a2,才能进行初始化
a=a2/2;
A=a1+a;
B=b1+a;
[M,N] = size(im_i);
im_o = zeros(M,N);
im1=im_i(0:A,0:B);%第一个圆
for k1=A:a2:M
for k2=B:a2:N
剩下的就那么存就行了,你这是定位到圆,假如你想把直接切割成MN块的图像直接用imwrite就行了
clear all;
clc;
str='picturename';%这个地方改成你的的名称记得加上路径
img=imread([str,'jpg']);%读图像
img=rgb2gray(img)%变成灰度图像
level = graythresh(img);
bw=im2bw(img,level);%变成二值话
[row col]=size(bw);
%完成二值化 下面是要找到分割的坐标 注意是在img 上进行分割 产生单独的保存出来 任务就完成了
%这个是分成列
result1=sum(bw,2);%对每行求和得到列向量
[val ind]=max(result1);%返回最大的和 的下标,ind 即为焊接缝隙
因为黑色是0 白色是1 所以对行求和最大的值出现的地方就是焊接的缝隙
有什么不懂的你可以回复我,祝好!
以上就是关于求一个用otsu算法的图像分割matlab程序全部的内容,包括:求一个用otsu算法的图像分割matlab程序、图像分割matlab程序,运行后,分割结果为全黑,阈值th显示128,这是什么情况请求解答、如何利用matlab按照图形从图片中分割出来等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)