I = RGB 2 gray(RGB);%的圖片是灰度圖像。
[x,y]=大小(I);
BW = edge(I);
圖;imshow(壹);標題(“原件”)
圖;im show(BW);標題(“邊緣檢測圖像”)
rho_max=floor(sqrt(x^2+y^2))+1;%從原圖像的數組坐標計算ρ的最大值,整數部分加1。
%這個值作為ρ,θ坐標系中ρ的最大值。
accarray=zeros(rho_max,180);%定義ρ,θ坐標系的數組,初始值為0。
% θ的最大值,180度。
theta =[0:pi/180:pi];%定義θ數組並確定θ範圍。
對於n=1:x,
對於m=1:y
如果BW(n,m)==1
對於k=1:180
%將θ值代入霍夫變換方程,求出ρ值。
ρ=(m * cos(Theta(k))+(n * sin(Theta(k)));
%取ρ值和ρ最大值之和的壹半作為ρ坐標值(數組坐標),這是為了防止ρ值為負。
rho _ int = round(rho/2+rho _ max/2);
%識別ρ θ坐標(數組)中的點,即計數累加。
accarray(rho_int,k)=accarray(rho_int,k)+1;
結束
結束
結束
結束
%圖;色彩映射表灰色;
% imagesc(ACC array);標題(“霍夫變換圖”)
%xlabel('theta '),ylabel(' rho ');
% = = = =下面的程序顯示效果不如上面的= = = =%
carray = uint 8(ACC array);%轉換後數據將丟失
%圖;im show(ACC array);標題(“霍夫變換圖”)
%xlabel('theta '),ylabel(' rho ');
%軸打開,軸正常,保持;
% = = = = = =變換提取直線= = = =%
%找到由超過100像素的線的霍夫變換形成的點。
k = 1;%存儲陣列計數器
對於rho_n=1:rho_max%在霍夫變換數組中搜索。
對於θ_ m = 1:180
if accarray(rho_n,theta_m)>=10%設定直線的最小值。
case _ ACC array _ n(K)= rho _ n;%存儲搜索到的數組下標。
case _ ACC array _ m(K)= theta _ m;
K = K+1;
結束
結束
結束
%提取這些點形成的直線,輸出圖像數組為I_out。
I_out=zeros(x,y);
I_jiao_class=zeros(x,y);
對於n=1:x,
對於m=1:y
如果BW(n,m)==1
對於k=1:180
ρ=(m * cos(Theta(k))+(n * sin(Theta(k)));
rho _ int = round(rho/2+rho _ max/2);
%如果正在計算的點屬於100以上的像素,則提取該點。
對於a=1:K-1
if rho _ int = = case _ ACC array _ n(a)& amp;k = = case _ accarray _ m(a)% % = = Gai = = % % % k = = case _ accarray _ m(a)& amp;rho_int==case_accarray_n(a)
I_out(n,m)=BW(n,m);
I_jiao_class(n,m)= k;
結束
結束
結束
結束
結束
結束
圖;im show(I _ out);標題(“經典霍夫變換提取的圖像”);
% = = = = = =霍夫變換= = = = = = =%。
%=====matlab自帶函數= = = = = =%。
%入口圖像是BW,出口圖像是h。
% [H,T,R] = hough(BW,' RhoResolution ',0.5,' ThetaResolution ',0.5);
%圖;imshow(H,' XData ',T,' YData ',R,' InitialMagnification ',' fit ');標題(“霍夫變換矩陣”)
% xlabel('theta '),ylabel(' rho ');
%軸打開,軸正常,保持;