『壹』 求一個用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);
效果就是,單個顏色分量的可以閾值分割,但是一起分割就效果不理想了