分水嶺演算法matlab
⑴ imreconstruct 這個matlab的函數有人懂的嗎
imreconstruct()函數的功能是對圖形形態修飾。
imreconstruct()書寫主要格式為
IM = imreconstruct(MARKER,MASK)
MARKER——標記,標記和掩碼可以是兩個灰度圖像或兩個二進制圖像具有相同的大小。標記必須是相同的大小。
MASK——面膜,作為面膜,其元素必須小於或等於面具的相應元素。
應用實例代碼:
I = imread('snowflakes.png'); 讀寫圖形文件,snowflakes.png
mask = adapthisteq(I); 對比度自適應直方圖均衡化(CLAHE)
se = strel('disk',5); 形態學結構元素
marker = imerode(mask,se); 圖像灰度化
obr = imreconstruct(marker,mask);
figure, imshow(mask,[]), 修飾前的圖形(圖1)
figure, imshow(obr,[]) 修飾後的圖形(圖2)
作者寫的非常詳細。
% 數字圖像處理程序作業
% 本程序能將JPG格式的彩色圖像文件灰度化並進行直方圖均衡
%
% 輸入文件:PicSample.jpg 待處理圖像
% 輸出文件:PicSampleGray.bmp 灰度化後圖像
% PicEqual.bmp 均衡化後圖像
%
% 輸出圖形窗口說明
% figure NO 1 待處理彩色圖像
% figure NO 2 灰度化後圖像
% figure NO 3 直方圖
% figure NO 4 均衡化後直方圖
% figure NO 5 灰度變化曲線
% figure NO 6 均衡化後圖像
% 1, 處理的圖片名字要為 PicSample.jpg
% 2, 程序每次運行時會先清空workspace
% 作者;archiless lorder
clear all
%一,圖像的預處理,讀入彩色圖像將其灰度化
PS=imread('PicSample.jpg'); %讀入JPG彩色圖像文件
imshow(PS) %顯示出來 figure NO 1
title('輸入的彩色JPG圖像')
imwrite(rgb2gray(PS),'PicSampleGray.bmp'); %將彩色圖片灰度化並保存
PS=rgb2gray(PS); %灰度化後的數據存入數組
figure,imshow(PS) %顯示灰度化後的圖像,也是均衡化前的樣品 figure NO 2
title('灰度化後的圖像')
%二,繪制直方圖
[m,n]=size(PS); %測量圖像尺寸參數
GP=zeros(1,256); %預創建存放灰度出現概率的向量
for k=0:255
GP(k+1)=length(find(PS==k))/(m*n); %計算每級灰度出現的概率,將其存入GP中相應位置
end
figure,bar(0:255,GP,'g') %繪制直方圖 figure NO 3
title('原圖像直方圖')
xlabel('灰度值')
ylabel('出現概率')
%三,直方圖均衡化
S1=zeros(1,256);
for i=1:256
for j=1:i
S1(i)=GP(j)+S1(i); %計算Sk
end
end
S2=round(S1*256); %將Sk歸到相近級的灰度
for i=1:256
GPeq(i)=sum(GP(find(S2==i))); %計算現有每個灰度級出現的概率
end
figure,bar(0:255,GPeq,'b') %顯示均衡化後的直方圖 figure NO 4
title('均衡化後的直方圖')
xlabel('灰度值')
ylabel('出現概率')
figure,plot(0:255,S2,'r') %顯示灰度變化曲線 figure NO 5
legend('灰度變化曲線')
xlabel('原圖像灰度級')
ylabel('均衡化後灰度級')
%四,圖像均衡化
PA=PS;
for i=0:255
PA(find(PS==i))=S2(i+1); %將各個像素歸一化後的灰度值賦給這個像素
end
figure,imshow(PA) %顯示均衡化後的圖像 figure NO 6
title('均衡化後圖像')
imwrite(PA,'PicEqual.bmp');
⑶ 求!!用分水嶺演算法圖像分割的matlab模擬的程序
能否也給我發一份分水嶺源代碼,最近我也在找這方面的程序,自己寫不出來。不勝感激[email protected]
⑷ 求經典MATLAB分水嶺演算法源代碼
%%都不知道你是啥樣的分割 什麼圖片
clear, close all;
clc;
PathName='d:\';%t為自填內容,下面p類似
FileName=[PathName 'test.jpg'];
Image=imread(FileName);
subplot(2,2,1);subimage(Image);title('原圖');;pixval on;
B=[1,1,1;1,1,1;1,1,1];%方形結構元
E8=[-1,0;-1,1;0,1;1,1;1,0;1,-1;0,-1;-1,-1]; % 8-連通結構元坐標
maskLenth=length(E8); % 結構元點的個數
[X,Y]=size(Image);
%原始圖像image 賦值給A1
n=1;
A(:,:,n)=Image;
M=zeros(X,Y);
Mark_Image=zeros(X,Y);
%產生距離圖
while sum(sum(A(:,:,n)))~=0
A(:,:,n+1)= imerode(A(:,:,n),B);
U(:,:,n)= (A(:,:,n)-A(:,:,n+1))*n;
M=M+U(:,:,n);
n=n+1;
end
n=n-1;
subplot(2,2,2);imagesc(M,[0,n]);title('距離圖');
% 搜尋局部最大值,將其放入Deal_Image
Deal_Image=zeros(X,Y);
while n>0
for high=1:X
for width=1:Y
%********************************************************************
Mark_Bool=0;
if M(high,width)==n
%______________________________________________________________
for dot=1:maskLenth
i=E8(dot,1); j=E8(dot,2);
if high+i>=1 & width+j>=1 & high+i<=X & width+j<=Y & M(high+i,width+j)>M(high,width);
Mark_Bool=1;break;
end % if_end
end % for dot_end
%______________________________________________________________
if Mark_Bool==0;
Deal_Image(high,width)=M(high,width);
end %if end
%______________________________________________________________
end %if end
%********************************************************************
end %for-end
end %for-end
n=n-1;
end % while n=0 end
Deal_Image =[Deal_Image>=1]
subplot(2,2,3);subimage(Deal_Image);title('輸出圖像');
Mark_Number=1;
while n>0
for high=1:X
for width=1:Y
Mark_Bool=0;
%********************************************************************
if M(high,width)==n
%______________________________________________________________
for dot=1:maskLenth
i=E8(dot,1); j=E8(dot,2);
if high+i>=1 & width+j>=1 & high+i<=X & width+j<=Y & Mark_Image(high+i,width+j)>0;
Mark_Image(high,width)=Mark_Image(high+i,width+j);
Mark_Bool=1;break;
end % if_end
end % for dot_end
%______________________________________________________________
if Mark_Bool==0;
Mark_Image(high,width)=Mark_Number;
Mark_Number=Mark_Number+1;
end %if end
%______________________________________________________________
pause;
subplot(2,2,2);imagesc(Mark_Image,[0,Mark_Number]);title('輸出圖像');
end %if end
%********************************************************************
end %for-end
end %for-end
n=n-1;
end % while n=0 end
subplot(2,2,3);imagesc(Mark_Image,[0,Mark_Number]);title('分割後的圖像');
uicontrol('Style','edit','string',['分割出區域:',Num2str(Mark_Number-1),'個'],...
'Position', [400 0 150 18],'FontSize',12,'FontWeight','light');
⑸ 尋找分水嶺,canny邊緣檢測的matlab程序~
以下是一段MATLAB程序,經運行沒問題。有注釋,有分水嶺演算法。
afm = imread('cameraman.tif');figure, imshow(afm);
se = strel('disk', 15);
Itop = imtophat(afm, se); % 高帽變換
Ibot = imbothat(afm, se); % 低帽變換
figure, imshow(Itop, []); % 高帽變換,體現原始圖像的灰度峰值
figure, imshow(Ibot, []); % 低帽變換,體現原始圖像的灰度谷值
Ienhance = imsubtract(imadd(Itop, afm), Ibot);% 高帽圖像與低帽圖像相減,增強圖像
figure, imshow(Ienhance);
Iec = imcomplement(Ienhance); % 進一步增強圖像
Iemin = imextendedmin(Iec, 20); figure,imshow(Iemin) % 搜索Iec中的谷值
Iimpose = imimposemin(Iec, Iemin);
wat = watershed(Iimpose); % 分水嶺分割
rgb = label2rgb(wat); figure, imshow(rgb); % 用不同的顏色表示分割出的不同區域
⑹ MATLAB 圖像分割的 分水嶺演算法 的源代碼,麻煩有的人發一份給我,謝謝
直方圖均衡化也是非線性量化的一種吧,網上找到的,作者寫的非常詳細。
% 數字圖像處理程序作業
% 本程序能將JPG格式的彩色圖像文件灰度化並進行直方圖均衡
%
% 輸入文件:PicSample.jpg 待處理圖像
% 輸出文件:PicSampleGray.bmp 灰度化後圖像
% PicEqual.bmp 均衡化後圖像
%
% 輸出圖形窗口說明
% figure NO 1 待處理彩色圖像
% figure NO 2 灰度化後圖像
% figure NO 3 直方圖
% figure NO 4 均衡化後直方圖
% figure NO 5 灰度變化曲線
% figure NO 6 均衡化後圖像
% 1, 處理的圖片名字要為 PicSample.jpg
% 2, 程序每次運行時會先清空workspace
% 作者;archiless lorder
clear all
%一,圖像的預處理,讀入彩色圖像將其灰度化
PS=imread('PicSample.jpg'); %讀入JPG彩色圖像文件
imshow(PS) %顯示出來 figure NO 1
title('輸入的彩色JPG圖像')
imwrite(rgb2gray(PS),'PicSampleGray.bmp'); %將彩色圖片灰度化並保存
PS=rgb2gray(PS); %灰度化後的數據存入數組
figure,imshow(PS) %顯示灰度化後的圖像,也是均衡化前的樣品 figure NO 2
title('灰度化後的圖像')
%二,繪制直方圖
[m,n]=size(PS); %測量圖像尺寸參數
GP=zeros(1,256); %預創建存放灰度出現概率的向量
for k=0:255
GP(k+1)=length(find(PS==k))/(m*n); %計算每級灰度出現的概率,將其存入GP中相應位置
end
figure,bar(0:255,GP,'g') %繪制直方圖 figure NO 3
title('原圖像直方圖')
xlabel('灰度值')
ylabel('出現概率')
%三,直方圖均衡化
S1=zeros(1,256);
for i=1:256
for j=1:i
S1(i)=GP(j)+S1(i); %計算Sk
end
end
S2=round(S1*256); %將Sk歸到相近級的灰度
for i=1:256
GPeq(i)=sum(GP(find(S2==i))); %計算現有每個灰度級出現的概率
end
figure,bar(0:255,GPeq,'b') %顯示均衡化後的直方圖 figure NO 4
title('均衡化後的直方圖')
xlabel('灰度值')
ylabel('出現概率')
figure,plot(0:255,S2,'r') %顯示灰度變化曲線 figure NO 5
legend('灰度變化曲線')
xlabel('原圖像灰度級')
ylabel('均衡化後灰度級')
%四,圖像均衡化
PA=PS;
for i=0:255
PA(find(PS==i))=S2(i+1); %將各個像素歸一化後的灰度值賦給這個像素
end
figure,imshow(PA) %顯示均衡化後的圖像 figure NO 6
title('均衡化後圖像')
imwrite(PA,'PicEqual.bmp');
⑺ 急求分水嶺和水平集演算法的MATLAB代碼
...matlab已經自己實現了分水嶺演算法了,調用watershed()函數就行,至於水平集就不太清楚了!!
⑻ 幫幫我 我不知道分水嶺演算法在圖像分割中的應用…… 代碼,還有別的幫幫我
clear,clc
%三種方法進行分水嶺分割
%讀入圖像
filename='sar1.bmp';
f=imread(filename);
Info=imfinfo(filename);
if Info.BitDepth>8
f=rgb2gray(f);
end
figure,mesh(double(f));%顯示圖像,類似集水盆地
%方法1:一般分水嶺分割,從結果可以看出存在過分割問題
b=im2bw(f,graythresh(f));%二值化,注意應保證集水盆地的值較低(為0),否則就要對b取反
d=bwdist(b); %求零值到最近非零值的距離,即集水盆地到分水嶺的距離
l=watershed(-d); %matlab自帶分水嶺演算法,l中的零值即為風水嶺
w=l==0; %取出邊緣
g=b&~w; %用w作為mask從二值圖像中取值
figure
subplot(2,3,1),imshow(f);
subplot(2,3,2),imshow(b);
subplot(2,3,3),imshow(d);
subplot(2,3,4),imshow(l);
subplot(2,3,5),imshow(w);
subplot(2,3,6),imshow(g);
%方法2:使用梯度的兩次分水嶺分割,從結果可以看出還存在過分割問題(在方法1的基礎上改進)
h=fspecial('sobel');%獲得縱方向的sobel運算元
fd=double(f);
g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);%使用sobel運算元進行梯度運算
l=watershed(g);%分水嶺運算
wr=l==0;
g2=imclose(imopen(g,ones(3,3)),ones(3,3));%進行開閉運算對圖像進行平滑
l2=watershed(g2);%再次進行分水嶺運算
wr2=l2==0;
f2=f;
f2(wr2)=255;
figure
subplot(2,3,1),imshow(f);
subplot(2,3,2),imshow(g);
subplot(2,3,3),imshow(l);
subplot(2,3,4),imshow(g2);
subplot(2,3,5),imshow(l2);
subplot(2,3,6),imshow(f2);
%方法3:使用梯度加掩模的三次分水嶺演算法(在方法2的基礎上改進)
h=fspecial('sobel');%獲得縱方向的sobel運算元
fd=double(f);
g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);%使用sobel運算元進行梯度運算
l=watershed(g);%分水嶺運算
wr=l==0;
rm=imregionalmin(g); %計算圖像的區域最小值定位,該函數僅僅是用來觀察為何分水嶺演算法產生這么多集水盆地
im=imextendedmin(f,2);%上面僅是產生最小值點,而該函數則是得到最小值附近的區域,此處的附近是相差2的區域
fim=f;
fim(im)=175; %將im在原圖上標識出,用以觀察
lim=watershed(bwdist(im));%再次分水嶺計算
em=lim==0;
g2=imimposemin(g,im|em);%在梯度圖上標出im和em,im是集水盆地的中心,em是分水嶺
l2=watershed(g2); %第三次分水嶺計算
f2=f;
f2(l2==0)=255; %從原圖對分水嶺進行觀察
figure
subplot(3,3,1),imshow(f);
subplot(3,3,2),imshow(g);
subplot(3,3,3),imshow(l);
subplot(3,3,4),imshow(im);
subplot(3,3,5),imshow(fim);
subplot(3,3,6),imshow(lim);
subplot(3,3,7),imshow(g2);
subplot(3,3,8),imshow(l2)
subplot(3,3,9),imshow(f2);
⑼ MATLAB 分水嶺分割演算法
其實,這涉及到命令和演算法,單一的命令往往不能解決所有的問題,要有前處理或後處理,才能達到目的。另外,也說明,某個命令應該升級或更新了。所以,watershed這個命令,單用達不到所期望的效果,只有加上預處理才行。
⑽ MATLAB的分水嶺演算法
樓上的到處都是這句話,無敵了你