Matlab 图像处理的一些杂记
圖像直方圖均衡- -
Tag: 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');
圖像腐蝕操作- -
Tag: matlab ?? 圖像處理 ?? 腐蝕 ?? ??????????????????????????????????????
function erode0207all(Input,thresh,element)
% 本程序能夠對灰度圖像先進行二值化,再進行腐蝕操作
% 格式介紹:Input為欲處理的灰度圖像;thresh為自選的閾值參數進行二值化,可輸入0到255之間任意整數
%?????????? element為進行腐蝕操作的結構單元,本程序可提供3×3、5×5、7×7等奇數方陣的結構單元,
%????????????????? 原點都在中心位置,建議用三階或五階方陣
%? 作者;archiless lorder????????
%----------------------------Begin Code------------------------------
% 一,圖像二值化處理
[m,n]=size(Input);????????????? % 確定原圖像的長、寬
Two=zeros(m,n);???????????????? % 定義二值化矩陣
Two(find(Input>=thresh))=1;???? % 對原圖像進行二值化處理
% 二,腐蝕操作前的預處理
Temp=zeros(element);??????????? % 定義3×3或5×5的結構單元
Output=zeros(m,n);????????????? % 定義輸出矩陣
s=m+1-element;????????????????? % s、t為循環長度
t=n+1-element;
Length=element-1;?????????????? % Length和Radius的含義在循環中介紹
Radius=Length/2;
square=element*element;???????? % 兩個結構單元中元素的總和,即 9 、25 、49 …………
% 三,進行腐蝕操作
for i=1:s
??? for j=1:t
??????? Temp=Two(i:i+Length,j:j+Length);??? % 從二值化圖像中依次取出三階或五階方陣
??????? if sum(Temp(:))==square???????????? % 判斷方陣中元素總和為 9 或 25 時
??????????? Output(i+Radius,j+Radius)=1;??? %方陣中心元素在輸出矩陣中相應位置上的值為 1
??????? end
??? end
end
% 四,輸出處理前后的圖像
figure,subplot(221),imshow(Input),title('原圖像');
subplot(222),imshow(Two),title('二值化后的圖像');
subplot(223),imshow(Output),title('腐蝕后的圖像');
%--------------------------------End Code--------------------------------
?
拉普拉斯算子邊緣檢測- -
Tag: matlab ?? 圖像處理 ?? 邊緣檢測 ?? ??????????????????????????????????????
function PicOut=Lap_edge(PicInput,thresh)???????????
% 本程序能夠將BMP格式的黑白灰度圖像用拉普拉斯算子進行邊緣檢測
% 生物圖像處理作業2
% 格式為 a=Lap_edge(PicInput,thresh) 或者嵌套為 Lap_edge(imread('rice.tif'),15)
% thresh參數可自選,對于rice.tif這張圖來說最合適的值大約為14到18
% 使用例子:PicInput=imread('rice.tif');
%?????????? a=Lap_edge(PicInput,15);
%---------------- BEGIN CODE ----------------
%? 作者;archiless lorder????????
% 一,原圖像預處理,讀入黑白圖片并確定長和寬
[m,n]=size(PicInput);??????????????????????????? %確定圖片的長和寬
% 二,拉普拉斯變換預處理,定義鏡框矩陣和輸出矩陣
r=m+2;?????????????????????????????????????????? %把圖片的長和寬各加2
c=n+2;
PicFrame=zeros(r,c);???????????????????????????? %定義二維數組"PicFrame",長、寬比"Input"各多2,成為鏡框的尺寸
b=zeros(m,n);??????????????????????????????????? %定義濾波后的數組
% 三,拉普拉斯運算的三個矩陣
Temp=zeros(3);?????????????????????????????????? %定義三階方陣"Temp",為臨時矩陣
op=[0 -1 0;-1 4 -1;0 -1 0];????????????????????? %定義拉普拉斯算子
Result=zeros(3);???????????????????????????????? %定義三階方陣"Result",為運算結果矩陣
% 四,原圖像矩陣處理,做一個"像框"???????????????????????????????????
PicFrame(2:m+1,2:n+1)=PicInput;????????????????? %把原圖的矩陣放到新的矩陣"PicFrame"中心,它的第一行、最后一行、第一列、
???????????????????????????????????????????????? %最后一列都是"0",即原圖矩陣周圍有一圈"0"的邊緣,好像給圖像加一個像框
PicFrame(1,:)=PicFrame(2,:);???????????????????? %把第二行的值賦給第一行
PicFrame(r,:)=PicFrame(r-1,:);?????????????????? %把倒數第二行的值賦給最后一行
PicFrame(:,1)=PicFrame(:,2);???????????????????? %把第二列的值賦給第一列
PicFrame(:,c)=PicFrame(:,c-1);?????????????????? %把倒數第二列的值賦給最后一列
% 五,用拉普拉斯算子進行濾波
for i=1:m
??? for j=1:n
??????? Temp=PicFrame(i:i+2,j:j+2);???????????? %從"PicFrame"矩陣中依次取出三階方陣,賦值給臨時矩陣"Temp"
??????? Result=Temp.*op;??????????????????????? %臨時矩陣與拉普拉斯算子"點乘",賦值給結果矩陣"Result"
??????? b(i,j)=sum(sum(Result));???
??????????????????????????????????????????????? %結果矩陣中"十"字線上元素相加,賦值給輸出矩陣中相應的位置,
??????????????????????????????????????????????? %即臨時矩陣中心元素所對應的位
??? end
end
% 六,設定閾值,將圖像二值化
% thresh=1.618*mean2(abs(b))??? 可用黃金分割的比例選閾值優點是邊緣清晰?????????????????????????????????????????????
e=repmat(logical(uint8(0)),m,n);???????????????? %創建數組
e(find(b>thresh))=1;???????????????????????????? %閾值判斷二值化
PicOut=e;??????????????????????????????????????? %函數輸出
figure,subplot(1,2,1),imshow(PicInput);?????????? %顯示原圖片
title('原圖像');
subplot(1,2,2),imshow(e);??????????????????????? %顯示拉普拉斯邊緣檢測后的圖片
title('自編函數邊緣檢測后的圖像');
%----------------END OF CODE ----------------
圖像開操作- -
Tag: matlab ?? ??????????????????????????????????????
function open0207(I,thresh,element)
% 本程序能夠對灰度圖像先進行二值化,再進行開操作
% 本程序先調用腐蝕函數,再調用膨脹函數,實現開操作
%? 作者;archiless lorder????????
% 一,調用腐蝕函數
[C,B]=erode0207simple(I,thresh,element);
% 二,調用膨脹函數
F=dilate0207simple(C,1,element);
% 三,輸出圖像
figure,subplot(221),imshow(I),title('原圖像');
subplot(222),imshow(B),title('二值化后的圖像');
subplot(223),imshow(F),title('開操作后的圖像');
圖像閉操作- -
Tag: matlab ?? 圖像 ?? close ?? ??????????????????????????????????????
function close0207(I,thresh,element)
% 本程序能夠對灰度圖像先進行二值化,再進行閉操作
% 本程序先調用膨脹函數,再調用腐蝕函數,實現閉操作
%? 作者;archiless lorder????????
% 一,調用膨脹函數
[F,E]=dilate0207simple(I,thresh,element);
% 二,調用腐蝕函數
C=erode0207simple(F,1,element);
% 三,輸出圖像
figure,subplot(221),imshow(I),title('原圖像');
subplot(222),imshow(E),title('二值化后的圖像');
subplot(223),imshow(C),title('閉操作后的圖像');
函數的可視化與Matlab作
2.1 實驗與觀察:函數的可視化
2.1.1 Matlab二維繪圖命令
1.周期函數與線性p-周期函數
?????? ◆?? 觀察? :
?? 【??? clf, x=linspace(0,8*pi,100);
F=inline('sin(x+cos(x+sin(x)))');
y1=sin(x+cos(x+sin(x)));?? y2=0.2*x+sin(x+cos(x+sin(x)));
plot(x,y1,'k:',x,y2,'k-')? legend('sin(x+cos(x+sin(x))','0.2x+sin(x+cos(x+sin(x)))',2) 】
?2. plot指令:繪制直角坐標的二維曲線
3. 圖形的屬性設置和屏幕控制
??????? 【???? h=plot([0:0.1:2*pi],sin([0:0.1:2*pi])); grid on
?set(h,'LineWidth',5,'color','red'); set(gca,'GridLineStyle','-','fontsize',16)? 】
???
????? ◆設置y坐標的刻度并加以說明,并改變字體的大小。
【???? h=plot([0:0.1:2*pi],sin([0:0.1:2*pi]));grid on,
?set(gca,'ytick',[-1 -0.5 0 0.5 1]),? set(gca,'yticklabel','a|b|c|d|e'),
?set(gca,'fontsize',20)?????????????? 】
4. 文字標注指令
???????? 【???? plot(x,y1,'b',x,y2,'k-') ,
????????????? set(gca,'fontsize',15,'fontname','times New Roman'),? %設置軸對象的字體為times
??????????????????????????? % New Roman,字體的大小為15
? title(' \it{Peroid and linear peroid function}');????? %加標題,注意文字用單引號' ' 加上?????????????
??????????? %斜杠'\'后可輸入不同的設置,例如it{…}表示花括號里的文字為斜體;如果有多項設置,
???????????? %則可用\…\…\…連續輸入。
? xlabel('x from 0 to 8*pi it{t}\'); ylabel('\it{y}');?????? %說明坐標軸
??????? text(x(49),y1(50)-0.4,'\fontsize{15}\bullet\leftarrowThe period function {\itf(x)}');???????
???????? %在坐標(x(49),y1(50)-0.4)處作文字說明, 各項設置用"\"隔開。
????????????????????? %\fontsize{15}\bullet\leftarrow的意義依次是:\字體大小=15 \ 畫圓點 \左箭頭
?text(x(14),y2(50)+1,'\fontsize{15}The linear period? function {\itg(x)}\rightarrow
\bullet')???????? %與上一語句類似,用右箭頭??????????????????? 】
?
圖2.5?? 文字標注
????????? ◆觀察指令legend和num2str的用法:在同一張圖上畫出 , 這里 , 并進行適當的標注。
? zxy2_2.m
?【???? clf, t=0:0.1:3*pi;alpha=0:0.1:3*pi;
? plot(t,sin(t),'r-');hold on;? plot(alpha,3*exp(-0.5*alpha),'k:');
? set(gca,'fontsize',15,'fontname','times New Roman'),????
? xlabel('\it{t(deg)}');ylabel('\it{magnitude}');
title(' \it{sine wave and {\it{Ae}}^{-\alpha{\itt}}wave}');? %注意\alpha的意義
text(6,sin(6),'\fontsize{15}The Value \it{sin(t)} at {\itt}=6\rightarrow\bullet', 'HorizontalAlignment','right'),
?? %上面的語句是一整行,如果要寫成兩行,必須使用續行號 … ,例如要在“ bullet',”
??? %后換行,需寫“bullet', …”后才能換行。
??? % 'HorizontalAlignment','right' 表示箭頭所指的曲線對象在 文字的右邊。
text(2,3*exp(-0.5*2),['\fontsize{15}\bullet\leftarrow The Value of \it{3e}^{-0.5 \it{t}}=',num2str(3*exp(-0.5*2)),' at \it{t} =2 ']);
???????? %num2str的用法:['string1' ,num2str,'string2'],注意方括號的使用。
%legend('\itsin(t)','{\itAe}^{-\alphat}')?? % 請結合圖形觀察此命令的使用???????? 】
????????? 運行結果如圖2.6所示。
?????????
5. 圖形窗口的創建和分割
???????? ◆觀察:
【??? clf,b=2*pi;x=linspace(0,b,50);
for k =1:9
??? y=sin(k*x);
??? subplot(3,3,k),plot(x,y),axis([0,2*pi,-1,1])
end????????????????????? 】
2.1.2多元函數的可視化與空間解析幾何(三維圖形)
??????? 本節通過高等數學的幾個例子觀察Matlab的三維繪圖功能和技巧。
1. 繪制二元函數
????????? ◆觀察:繪制? 的圖象,作定義域的裁剪。
???????? ◆(1)觀察meshgrid指令的效果。
【? a=-0.98;b=0.98;c=-1;d=1;n=10;
x=linspace(a,b,n); y=linspace(c,d,n);
[X,Y]=meshgrid(x,y);
plot(X,Y,'+')? 】
????????? ★三維繪圖指令mesh、meshc、surf。
?????????? ◆(2)做函數的定義域裁剪,觀察上述三維繪圖指令的效果。
程序zxy2_4.m
【??? clear,clf,
a=-1;b=1;c=-15;d=15;n=20;eps1=0.01;
x=linspace(a,b,n);y=linspace(c,d,n);
[X,Y]=meshgrid(x,y);
for i=1:n???????????????????????????????? %計算函數值z ,并作定義域裁剪
?? for j=1:n
???? if (1-X(i,j))<eps1|X(i,j)-Y(i,j)<eps1??? %if語句這樣用
??????? z(i,j)=NaN;????????????????????????????? %作定義域裁剪,定義域以外的函數值為NaN
???? else
??????? z(i,j)=1000*sqrt(1-X(i,j))^-1.*log(X(i,j)-Y(i,j));?
???? end
?? end
end?????????????????
??? zz=-20*ones(1,n);plot3(x,x,zz),grid off,hold on??????? %畫定義域的邊界線
mesh(X,Y,z)???????????????????? %繪圖,讀者可用meshz,? surf,? meshc在此替換之 ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
xlabel('x'),ylabel('y'),zlabel('z'),?? box on????? %把三維圖形封閉在箱體里? 】
???????? ◆運行了zxy2_4.m 以后,有關向量存儲在工作空間中,在此基礎上,觀察上述等值線繪制指令的運行效果。
?【?? [cs,h]=contour(X,Y,z,15);? clabel(cs,h,'labelspacing',244)????????? 】
2. 三元函數可視化: slice指令
?????? ◆? 觀察: 繪制三元函數 的可視化圖形。
【???? clf,x=linspace(-2,2,40); y=x; z=x;
??????? [X,Y,Z]=meshgrid(x,y,z); w=X.^2+Y.^2+Z.^2;
slice(X,Y,Z,w,[-1,0,1],[-1,0,1],[-1,0,1]),colorbar????????????? 】
3. 空間曲線及其運動方向的表現:plot3和quiver指令
【??? clf,? t=0:0.1:1.5;
Vx=2*t;Vy=2*t.^2;Vz=6*t.^3-t.^2;
x=t.^2;y=(2/3)*t.^3;z=(6/4)*t.^4-(1/3)*t.^3;? %由速度得到曲線
plot3(x,y,z,'r.-'),hold on?????????????????????????????? %畫飛行軌跡
?%算數值梯度,也就是重新計算數值速度矢量,這只是為了編程的方便,不是必須的
?
圖2.12 飛機的飛行軌跡與方向
Vx=gradient(x);Vy=gradient(y);Vz=gradient(z);
quiver3(x,y,z,Vx,Vy,Vz),grid on??????? %畫速度矢量圖
xlabel('x'),ylabel('y'),zlabel('z')????? 】
2.2應用、思考和練習
2.2.1? 線性p周期函數
zxy2_3_f.m
【? function f=zxy2_3_f(x)
???? f=sin(x+cos(x));?????????????? 】
zxy2_3.m
【?? clear,clf
a=-8;b=12;n=300;xx=linspace(a,b,n);
h=zxy2_3_f(xx);
S(1)=0;
for i=2:n
? S(i)=S(i-1)+quad('zxy2_3_f',xx(i-1),xx(i));
end
subplot(1,2,1),plot(xx,S,'k-'),axis([a,b,-1.5,9])
subplot(1,2,2),plot(xx,[h;zeros(1,length(xx))],'k-'),axis([a,b,-1.5,1.5])?? 】
2.2.2 平面截割法和曲面交線的繪制
◆用平行截面法討論由曲面???? 構成的馬鞍面形狀。
???????
?zxy2_6.m ( 平行截割法示例 , 本程序的繪制兩曲面交線方法可以套用)?
【? clf, a=-20;eps0=1;
[x,y]=meshgrid(-10:0.2:10);? %生成平面網格
v=[-10 10 -10 10 -100 100];? %設定空間坐標系的范圍
colormap(gray)?????????????? %將當前的顏色設置為灰色
z1=(x.^2-2*y.^2)+eps;???? %計算馬鞍面函數z1=z1(x,y)
z2=a*ones(size(x));????????? %計算平面 z2=z2(x,y)
r0=abs(z1-z2)<=eps0;
?%計算一個和z1同維的函數r0,當abs(z1-z2)<=eps時r0 =1;當abs(z1-z2)>eps0時,r0 =0。
?%可用mesh(x,y,r0)語句觀察它的圖形,體會它的作用,該方法可以套用。
zz=r0.*z2;xx=r0.*x;yy=r0.*y; %計算截割的雙曲線及其對應的坐標
subplot(2,2,2),???? %在第2圖形窗口繪制雙曲線
?? h1=plot3(xx(r0~=0),yy(r0~=0),zz(r0~=0),'+');??????????
?? set(h1,'markersize',2),hold on,axis(v),grid on
subplot(2,2,1),???? %在第一圖形窗口繪制馬鞍面和平面
?? mesh(x,y,z1);grid,hold on;mesh(x,y,z2);???????????
?? h2=plot3(xx(r0~=0),yy(r0~=0),zz(r0~=0),'.'); %畫出二者的交線
?? set(h2,'markersize',6),hold on,axis(v),
for i=1:5?????????? %以下程序和上面是類似的,通過循環繪制一系列的平面去截割馬鞍面
?a=70-i*30;????? %在這里改變截割平面
?z2=a*ones(size(x)); r0=abs(z1-z2)<=1;? zz=r0.*z2;yy=r0.*y;xx=r0.*x;
?subplot(2,2,3),
??? mesh(x,y,z1);grid,hold on;mesh(x,y,z2);hidden off
??? h2=plot3(xx(r0~=0),yy(r0~=0),zz(r0~=0),'.'); axis(v),grid
?subplot(2,2,4),
??? h4=plot3(xx(r0~=0),yy(r0~=0),zz(r0~=0),'o');
??? set(h4,'markersize',2),hold on,axis(v),grid on
end?????????????? 】
???????
2.2.3 微分方程的斜率場
?????????
???????? ◆ 繪制微分方程? 的斜率場,并將解曲線畫在圖中,觀察斜率場和解曲線的關系。?
?????????? zxy2_5.m?? ( 繪制一階微分方程的斜率場和解曲線)
【????? clf,clear??????? %清除當前所有圖形窗口的圖像,清除當前工作空間的內存變量。
a=0;b=4;c=0;d=4;n=15;
[X,Y]=meshgrid(linspace(a,b,n),linspace(c,d,n));?? %生成區域中的網格。
z=X.*Y;?????????????????????????????????????????????? %計算斜率函數。?
Fx=cos(atan(X.*Y));Fy=sqrt(1-Fx.^2);? %計算切線斜率矢量。
quiver(X,Y,Fx,Fy,0.5),hold on,axis([a,b,c,d])
?? %在每一網格點畫出相應的斜率矢量,0.5是控制矢量大小的控制參數,可以調整。
[x,y]=ode45('zxy2_5f',[0,4],0.4);??? %求解微分方程。
????? %zxy2_5f.m是方程相應函數f(x,y)的程序,單獨編制;[x0,xs]=[0,4]為求解區間;
???? %y0=0.4為初始值;輸出變量x,y分別為解軌線自變量和因變量數組。
plot(x,y,'r.-')?? %畫解軌線? 】
?zxy2_5f.m (微分方程的函數子程序)
【??? function dy=zxy2_5f(x,y)
dy=x.*y;????????? 】
???????
2.2.4顏色控制和渲染及特殊繪圖指令
1.地球表面的氣溫分布(sphere指令)
????????? ◆
?【 [a,b,c]=sphere(40);t=max(max(abs(c)))-abs(c);surf(a,b,c,t);
axis('equal'),colormap('hot'), shading flat,colorbar?? 】
2.旋轉曲面的生成:柱面指令cylinder和光照控制指令surfl
???????? ◆
?【?????? x=0:0.1:10;z=x;y=1./(x.^3-2.*x+4);
?? [u,v,w]=cylinder(y);surfl(u,v,w,[45,45]);
?? shading interp??? 】
3.若干特殊圖形
???????? ◆ 運行下面程序,了解各指令的用法和效果。
【??? x=[1:10]; y=[5 6 3 4 8 1 10 3 5 6];
subplot(2,3,1),bar(x,y),axis([1 10 1 11])
subplot(2,3,2),hist(y,x),axis([1 10 1 4])
subplot(2,3,3),stem(x,y,'k'),axis([1 10 1 11])
subplot(2,3,4),stairs(x,y,'k'),? axis([1 10 1 11])
subplot(2,3,5), x = [1 3 0.5 5];explode = [0 0 0 1];pie(x,explode)
subplot(2,3,6),z=0:0.1:100; x=sin(z);y=cos(z).*10;
?comet3(x,y,z)????????????????????? 】
總結
以上是生活随笔為你收集整理的Matlab 图像处理的一些杂记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 眼图
- 下一篇: MOS管驱动电路总结