求一个用otsu算法的图像分割matlab程序

求一个用otsu算法的图像分割matlab程序,第1张

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按照图形从图片中分割出来等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9287991.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存