导航:首页 > 编程语言 > otsu自动阀值分割自编matlab程序

otsu自动阀值分割自编matlab程序

发布时间:2023-08-12 13:34:37

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

image_1=imread('E:\ebook\lena.bmp'); %读入图片
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)/(m*n);%计算各灰度级出现的比率
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+i*p(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+i*p(i)/qt2;
end
for i=t+1:256
v2=v2+((i-u2)^2)*p(i)/qt2;
end
if qt1*v1+qt2*v2<w
th=t; w=qt1*v1+qt2*v2 ;
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);%显示二值化后的图片

『贰』 MATLAB--数字图像处理 Otsu算法(双阈值)

该算法就是利用otsu算法计算出两个阈值
公式
g=w0 (u0-u)^2+w1 (u1-u) ^2+ w2*(u2-u) ^2
g最大值时,就可以选出两个阈值

求两个阈值

利用这两个阈值分割图像

主函数调用

『叁』 Matlab中Ostu算法自动阈值分割具体怎么操作

function threshold=ostu(filename);

x=imread(ff);
%figure;
%imshow(x);
[m,n]=size(x);
N=m*n;
num=zeros(1,256);
p=zeros(1,256);

for i=1:m
for j=1:n
num(x(i,j)+1)=num(x(i,j)+1)+1;
end
end

for i=0:255;
p(i+1)=num(i+1)/N;
end

totalmean=0;
for i=0:255;
totalmean=totalmean+i*p(i+1);
end

maxvar=0;

for k=0:255
kk=k+1;
zerosth=sum(p(1:kk));

firsth=0;
for h=0:k
firsth=firsth+h*p(h+1);
end

var=totalmean*zerosth-firsth;
var=var*var;
var=var/(zerosth*(1-zerosth)+0.01);
var=sqrt(var);
if(var>maxvar)
maxvar=var;
point=k;
end

end

threshold=point;

for i=0:255;
p(i+1)=num(i+1)/N;
end

totalmean=0;
for i=0:255;
totalmean=totalmean+i*p(i+1);
end

maxvar=0;

for k=0:255
kk=k+1;
zerosth=sum(p(1:kk));

『肆』 求一个matlab代码:使用otsu进行阈值分割,提取图中目标,背景全变为黑色或白色。

I=imread('coins.png');
figure,imshow(I);
level=graythresh(I);
BW=im2bw(I,level);
BW=imfill(BW,'holes');
figure,imshow(BW);

coins.png

『伍』 最佳阀值分割 编程实现otsu最佳全局阀值算法

a=imread('YuChu.bmp');
如果读入的是彩色图,需要用a=rgb2gray(a);转换为灰度图
加了这句我运行了下,程序没版出现错误也能权出图

另外matlab图像处理工具箱中用level = graythresh(I)函数去阈值,其方法与你的方法一致,都是Otsu方法

补充:
你看看a读入时数据的大小,要是3维的话就是RGB图像了,需要转一下
另外是程序错误还是结果不对?

『陆』 Matlab编程求一个最大类间方差法的计算最佳阈值的程序。

k的0~255循环求得每一个对应的fc=w0*(u0-ut).^2+w1*(u1-ut).^2;然后比较这256个fc中的最大值,对应的那个k就是ostu的阈值。所以你这个还差一个k的循环,并在循环里面求最大fc。
我这也有段求阈值的,你可以参考下

hist=zeros(256,1);%直方图
%threshold=128; %初始阈值
%计算直方图
for i=1:height
for j=1:width
m=I_gray(i,j)+1;
hist(m)=hist(m)+1;
end
end
hist=hist/(height*width);%落在每一灰度级上的概率
avg=0;
for m=1:256
avg=avg+(m-1)*hist(m);
end
temp=0;
for i=1:256
p1=0;
avg1=0;
avg2=0;
T_current=i-1;%当前分割阈值
for m=1:T_current-1
p1=hist(m)+ p1;%低灰度级概率总和
end
p2=1-p1;%高灰度级概率总和
for m=1:256
if m<T_current
avg1=avg1+(m-1)*hist(m);
else
avg2=avg2+(m-1)*hist(m);
end
end
avg1=avg1/p1;
avg2=avg2/p2;

D=p1*(avg1-avg)^2+p2*(avg2-avg)^2;
if D>=temp
finalT=T_current;
temp=D;
end
end
另外,站长团上有产品团购,便宜有保证

『柒』 用matlab求图像阈值分析程序,急啊~

我给你提供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; %显示坐标系

『捌』 matlab图像分割程序

clc
I=double(imread('source3.bmp')); %读入图像
I1=I;
%I=rgb2gray(I);
BW1=edge(I,'roberts'); % roberts算子
BW2=edge(I,'prewitt');
BW3=edge(I,'sobel');
BW4=edge(I,'log');
BW5= edge(I,'canny');
figure,
subplot(231),imshow(I,[]);title('原图');
subplot(232),imshow(BW1); title(' roberts算子');
subplot(233),imshow(BW2); title(' prewitt算子');
subplot(234),imshow(BW3); title(' sobel算子');
subplot(235),imshow(BW4); title(' log算子');
subplot(236),imshow(BW5); title(' canny算子');
% 双峰法是一种简单的阈值分割方法,即如果灰度级直方图呈现明显的双峰状,
% 则选双峰之间的谷底所对应的灰度级作为阈值分割。
I = imread('source3.bmp');
if ndims(I) == 3
I = rgb2gray(I);
end
fxy = imhist(I, 256); %统计每个灰度值的个数
figure;
subplot(2, 2, 1); imshow(I, []); title('原图')
subplot(2, 2, 2); plot(fxy); %画出灰度直方图
title('直方图')
p = 180/255;
bw = im2bw(I, p); %小于阈值的为黑,大于阈值的为白
subplot(2, 2, 3); imshow(bw); title('双峰阈值分割')
bw1 = im2bw(I, graythresh(I));
subplot(2, 2, 4); imshow(bw1); title('ostu阈值分割')

『玖』 matlab彩色图像的阈值分割

阈值分割就是针对灰度图像的,通过设定一个阈值可以在分割后达到二值化的效果。对彩色图像进行阈值分割,当然也是转成灰度图后进行分割了。

假如你对各个颜色分量分别进行阈值化,我给你试了试

a=imread('a.jpg');

[m,n,d]=size(a);

threshold=90;

fori=1:m

forj=1:n

fork=1:3

ifa(i,j,k)>90

a(i,j,k)=255;

elsea(i,j,k)=0;

end

end

end

end

a_origin=a;

a(:,:,2)=0;

a(:,:,3)=0;

subplot(121),imshow(a);

subplot(122),imshow(a_origin);

效果就是,单个颜色分量的可以阈值分割,但是一起分割就效果不理想了

阅读全文

与otsu自动阀值分割自编matlab程序相关的资料

热点内容
苹果932拦截骚扰电话 浏览:765
盲盒开箱app有哪些 浏览:422
win10激活脚本之家 浏览:191
魔鬼作坊工具包 浏览:185
ae源文件下载 浏览:520
如何将照片内容转换成pdf文件 浏览:137
浙里办app如何更换手机号码 浏览:244
电子资料文件有哪些 浏览:241
猥琐猫表情教程 浏览:599
android音频文件格式 浏览:458
漫画脸app哪里可以下载 浏览:959
购买欢乐升级欢乐豆 浏览:282
学习智能机器人用什么编程最好 浏览:655
苹果手机如何管控app 浏览:633
mn文件夹 浏览:590
安卓平板通用刷机包下载 浏览:751
安卓获取内部存储路径 浏览:880
写代码两台显示器 浏览:327
unitypackage压缩文件 浏览:493
奕心安卓 浏览:563

友情链接