Hough變換是實現影象邊緣檢測的一種有效方法,其基本思想是將測量空間的一點變換到參量空間中的一條曲線或一個曲面,而具有同一參量特徵的點交換後在參量空間中相交,透過判斷交點處的積累程度來完成特徵曲線的檢測,基於參量性質的不同,Hough變換可以檢測直線、圓、橢圓、雙曲線、拋物線等。同時,將機率論、模糊集理論、分層迭代的思想和級聯的方法應用於Hough變換的過程中,大大地提高了Hough變換的效率,改善了Hough變換的效能。 實驗主要使用的函式 MATLAB內部常數pi:圓周率 p(= 3.1415926...) MATLAB常用基本數學函式: abs(x):純量的絕對值或向量的長度; round(x):四捨五入至最近整數; floor(x):地板函式,即捨去正小數至最近整數; MATLAB常用三角函式 sin(x):正弦函式 cos(x):餘弦函式; 向量的常用函式 max(x): 向量x的元素的最大值。 MATLAB影象型別轉換函式: rgb2gray:將一副真彩色影象轉換成灰度影象; im2bw:透過設定高度閾值將真彩色,索引色,灰度圖轉換成二值影象; MATLAB圖形影象檔案的讀取和顯示函式 imread(filename); MATLAB二進位制影象及其顯示 imshow(f1)。 用double對二值影象雙精度化 圖形處理: sobel運算元檢測邊緣 hough變換檢測圓 分別顯示灰度影象: figure;subplot Sobel:運算元邊緣檢測影象 hough變換檢測後的影象 實驗相關程式碼 I=imread("*.jpg");f=rgb2gray(I); f1=im2bw(f,200/255); BW1=double(f1); BW=edge(BW1,"sobel",0.4); r_max=50; r_min=10;step_r=10;step_angle=pi/12;p=0.7; [m,n] = size(BW); size_r = round((r_max-r_min)/step_r)+1; size_angle = round(2*pi/step_angle); hough_space = zeros(m,n,size_r); [rows,cols] = find(BW); ecount = size(rows); for i=1:ecount for r=1:size_r for k=1:size_angle a = round(rows(i)-(r_min+(r-1)*step_r)*cos(k*step_angle)); b = round(cols(i)-(r_min+(r-1)*step_r)*sin(k*step_angle)); if(a>0&&a0&&b=max_para*p); length = size(index); hough_circle = false(m,n); for i=1:ecount for k=1:length par3 = floor(index(k)/(m*n))+1; par2 = floor((index(k)-(par3-1)*(m*n))/m)+1; par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m; if((rows(i)-par1)^2+(cols(i)-par2)^2(r_min+(par3-1)*step_r)^2-5) hough_circle(rows(i),cols(i)) = true; end end end for k=1:length par3 = floor(index(k)/(m*n))+1; par2 = floor((index(k)-(par3-1)*(m*n))/m)+1; par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m; par3 = r_min+(par3-1)*step_r; fprintf(1,"Center %d %d radius %d\n",par1,par2,par3); para(:,k) = [par1,par2,par3]; end subplot(221),imshow(f); subplot(222),imshow(BW); subplot(223),imshow(hough_circle)
Hough變換是實現影象邊緣檢測的一種有效方法,其基本思想是將測量空間的一點變換到參量空間中的一條曲線或一個曲面,而具有同一參量特徵的點交換後在參量空間中相交,透過判斷交點處的積累程度來完成特徵曲線的檢測,基於參量性質的不同,Hough變換可以檢測直線、圓、橢圓、雙曲線、拋物線等。同時,將機率論、模糊集理論、分層迭代的思想和級聯的方法應用於Hough變換的過程中,大大地提高了Hough變換的效率,改善了Hough變換的效能。 實驗主要使用的函式 MATLAB內部常數pi:圓周率 p(= 3.1415926...) MATLAB常用基本數學函式: abs(x):純量的絕對值或向量的長度; round(x):四捨五入至最近整數; floor(x):地板函式,即捨去正小數至最近整數; MATLAB常用三角函式 sin(x):正弦函式 cos(x):餘弦函式; 向量的常用函式 max(x): 向量x的元素的最大值。 MATLAB影象型別轉換函式: rgb2gray:將一副真彩色影象轉換成灰度影象; im2bw:透過設定高度閾值將真彩色,索引色,灰度圖轉換成二值影象; MATLAB圖形影象檔案的讀取和顯示函式 imread(filename); MATLAB二進位制影象及其顯示 imshow(f1)。 用double對二值影象雙精度化 圖形處理: sobel運算元檢測邊緣 hough變換檢測圓 分別顯示灰度影象: figure;subplot Sobel:運算元邊緣檢測影象 hough變換檢測後的影象 實驗相關程式碼 I=imread("*.jpg");f=rgb2gray(I); f1=im2bw(f,200/255); BW1=double(f1); BW=edge(BW1,"sobel",0.4); r_max=50; r_min=10;step_r=10;step_angle=pi/12;p=0.7; [m,n] = size(BW); size_r = round((r_max-r_min)/step_r)+1; size_angle = round(2*pi/step_angle); hough_space = zeros(m,n,size_r); [rows,cols] = find(BW); ecount = size(rows); for i=1:ecount for r=1:size_r for k=1:size_angle a = round(rows(i)-(r_min+(r-1)*step_r)*cos(k*step_angle)); b = round(cols(i)-(r_min+(r-1)*step_r)*sin(k*step_angle)); if(a>0&&a0&&b=max_para*p); length = size(index); hough_circle = false(m,n); for i=1:ecount for k=1:length par3 = floor(index(k)/(m*n))+1; par2 = floor((index(k)-(par3-1)*(m*n))/m)+1; par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m; if((rows(i)-par1)^2+(cols(i)-par2)^2(r_min+(par3-1)*step_r)^2-5) hough_circle(rows(i),cols(i)) = true; end end end for k=1:length par3 = floor(index(k)/(m*n))+1; par2 = floor((index(k)-(par3-1)*(m*n))/m)+1; par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m; par3 = r_min+(par3-1)*step_r; fprintf(1,"Center %d %d radius %d\n",par1,par2,par3); para(:,k) = [par1,par2,par3]; end subplot(221),imshow(f); subplot(222),imshow(BW); subplot(223),imshow(hough_circle)