『壹』 怎樣用hough變換求出直線長度
BOOL Hough(HWND hWnd){
//定義一個自己的直線結構
typedef struct{
int topx; //最高點的x坐標
int topy; //最高點的y坐標
int botx; //最低點的x坐標
int boty; //最低點的y坐標
}MYLINE;
DWORD BufSize;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HDC hDc;
LONG x,y;
long i,maxd;
int k;
int Dist,Alpha;
HGLOBAL hDistAlpha,hMyLine;
int *lpDistAlpha;
MYLINE *lpMyLine,*TempLine,MaxdLine;
static LOGPEN rlp={PS_SOLID,1,1,RGB(255,0,0)};
HPEN rhp;
//我們處理的實際上是256級灰度圖,不過只用到了0和255兩種顏色。
if( NumColors!=256){
MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!",
"Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
//計算最大距離
Dist=(int)(sqrt( (double)bi.biWidth*bi.biWidth+
(double)bi.biHeight*bi.biHeight)+0.5)
;
Alpha=180 /2 ; //0 到 to 178 度,步長為2度
//為距離角度數組分配內存
if((hDistAlpha=GlobalAlloc(GHND,(DWORD)Dist* Alpha * sizeof(int)))==NULL){
MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|
MB_ICONEXCLAMATION);
return FALSE;
}
//為記錄直線端點的數組分配內存
if((hMyLine=GlobalAlloc(GHND,(DWORD)Dist*Alpha*sizeof(MYLINE)))==NULL){
GlobalFree(hDistAlpha);
return FALSE;
}
//原圖緩沖區的大小
BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
lpDistAlpha=(int *)GlobalLock(hDistAlpha);
lpMyLine=(MYLINE *)GlobalLock(hMyLine);
for (i=0;i<(long)Dist*Alpha;i++){
TempLine=(MYLINE*)(lpMyLine+i);
(*TempLine).boty=32767; //初始化最低點的y坐標為一個很大的值
}
for (y=0;y<bi.biHeight;y++){
//lpPtr指向點陣圖數據
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
for (x=0;x<bi.biWidth;x++)
if(*(lpPtr++)==0) //是個黑點
for (k=0;k<180;k+=2){
//計算距離i
i=(long)fabs((x*cos(k*PI/180.0)+y*sin(k*PI/180.0)
));
//相應的數組元素加1
*(lpDistAlpha+i*Alpha+k/2)=*(lpDistAlpha+i*Alpha+k/2)+1;
TempLine=(MYLINE*)(lpMyLine+i*Alpha+k/2);
if(y> (*TempLine).topy){
//記錄該直線最高點的x,y坐標
(*TempLine).topx=x;
(*TempLine).topy=y;
}
if(y< (*TempLine).boty){
//記錄該直線最低點的x,y坐標
(*TempLine).botx=x;
(*TempLine).boty=y;
}
}
}
maxd=0;
for (i=0;i<(long)Dist*Alpha;i++){
TempLine=(MYLINE*)(lpMyLine+i);
k=*(lpDistAlpha+i);
if( k > maxd){
//找到數組元素中最大的,及相應的直線端點
maxd=k;
MaxdLine.topx=(*TempLine).topx;
MaxdLine.topy=(*TempLine).topy;
MaxdLine.botx=(*TempLine).botx;
MaxdLine.boty=(*TempLine).boty;
}
}
hDc = GetDC(hWnd);
rhp = CreatePenIndirect(&rlp);
SelectObject(hDc,rhp);
MoveToEx(hDc,MaxdLine.botx,MaxdLine.boty,NULL);
//在兩端點之間畫一條紅線用來標識
LineTo(hDc,MaxdLine.topx,MaxdLine.topy);
DeleteObject(rhp);
ReleaseDC(hWnd,hDc);
//釋放內存及資源
GlobalUnlock(hImgData);
GlobalUnlock(hDistAlpha);
GlobalFree(hDistAlpha);
GlobalUnlock(hMyLine);
GlobalFree(hMyLine);
return TRUE;
}
如果θ是給定的,用上述方法,我們可以找到該方向上最長的直線。
『貳』 為什麼hough變換能夠檢測形狀
hough
求助編輯網路名片國內外對Hough變換的研究及應用動態:Hough變換於1962年由Paul Hough提出,並在美國作為專利被發表。它所實現的是一種從圖像空間到參數空間的映射關系。由於具有一些明顯優點和可貴性質,它引起了許多國內外學者和工程技術人員的普遍關注。例如,由於其根據局部度量來計算全面描述參數,因而對於區域邊界被雜訊干擾或被其他目標遮蓋而引起邊界發生某些間斷的情況,它具有很好的容錯性和魯棒性。多年來,專家們對Hough變換的理論性質和應用方法進行了深入而廣泛的研究, 並取得了許多有價值的成果。
查看精彩圖冊
目錄
原理
改進方法
應用領域 生物醫學
自動化、機器人視覺
空間技術、軍事防禦
辦公自動化
不足之處
翻譯
展開 原理
改進方法
應用領域 生物醫學
自動化、機器人視覺
空間技術、軍事防禦
辦公自動化
不足之處
翻譯
展開 編輯本段原理 被遮擋的柑橘圖像經hough變換補償畫圓
Hough變換是一種使用表決原理的參數估計技術。其原理是利用圖像空間和Hough參數空間的點-線對偶性,把圖像空間中的檢測問題轉換到參數空間。通過在參數空間里進行簡單的累加統計,然後在Hough參數空間尋找累加器峰值的方法檢測直線。Hough變換的實質是將圖像空間內具有一定關系的像元進行聚類,尋找能把這些像元用某一解析形式聯系起來的參數空間累積對應點。在參數空間不超過二維的情況下,這種變換有著理想的效果。編輯本段改進方法Hough變換的實質是將圖像空間內具有一定關系的像元進行聚類,尋找能把這些像元用某一解析形式聯系起來的參數空間累積對應點。在參數空間不超過二維的情況下, 這種變換有著理想的效果。但是,一旦參數空間增大,計算量便會急劇上升,同時耗費巨大的存儲空間,耗時也隨之猛增。就此,多年來國內外眾多學者針對具體情況對常規Hough變換進行了多方面的探索,並提出了許多有價值的改進方法。 1)擴展應用范圍,提出多種參數化的方法 在早期的研究中,Hough變換由只檢測圖像中的直線擴展到檢測圓弧、二次曲線和任意曲線構成的形狀;線條的參數化方法也由最初的截距型參數發展到斜率傾角和截距型參數、雙Hough空間型參數、以及檢測圓的圓心坐標、半徑型參數和檢測物體復雜形狀的基於模板的多維關鍵點參數等。 2)提高實時性,提出多種減少計算量的方法 針對Hough變換計算量大的不足,相繼提出了四分樹結構的Hough變換、以梯度信息為引導的Hough變換、分層Hough變換、自適應Hough變換、快速自適應Hough變換、隨機Hough變換(RHT)等;對於高維Hough變換採用降維處理,數據結構多採用動態量化空間等。 3)增強抗干擾能力,提高檢測精度 Hough變換提取精度問題始終受到普遍關注,例如Hough變換的離散化誤差、混疊干擾、抗雜訊干擾性能等。就此類問題的研究例如,Kiryati、Buckstein提出採用最佳Kaider窗函數對參數域進行平滑濾波以減少混疊誤差;Hunt、Nolte等人應用信號檢測理論對Hough變換的抗干擾性能和基於最大後驗概率的最佳演算法進行了抗干擾性能比較,並指出了影響Hough變換抗干擾性能的原因。 4)多種峰值檢測方法 Hough變換中參數空間的峰值檢測是一個聚類檢測問題,閾值的選取是成功與否的關鍵所在。其中,一種方法是對圖像空間進行加權,以改變參數空間的峰值分布;一種方法是直接對參數空間進行極大值的搜索。編輯本段應用領域理論與實踐向來是形影不離,相輔相成,Hough變換之所以有如此長足的發展,主要原因還是在於實踐應用上的廣泛需求;而在實踐中所暴露出的不足又進而促進了它的發展,循環往復,就如同生命的演化。現枚舉其主要應用領域如下:
生物醫學
Hough變換已被成功應用於基於人工智慧的專家診斷系統;X射線人體照片和CT圖像的處理和判讀;光學顯微鏡和電子顯微鏡中的細胞核自動分析系統;從超聲波診斷中提取三維動脈特徵,等等。
自動化、機器人視覺
Hough變換已被用於產品部件的自動監視、缺陷診斷、生產過程的自動監控、計算機輔助製造(CAM)等。例如基於Hough變換的機械零件檢測和定位系統;基於Hough變換採用直線、圓弧等作為基本特徵的工業產品檢查系統。
空間技術、軍事防禦
Hough變換已被用於運動目標軌跡的檢測與識別,高空偵察機、間諜衛星和軍事雷達等目標自動識別系統的特徵提取。例如應用Hough變換對戰斗機的外形特徵進行提取和自動識別;應用Hough變換輔以信號檢測理論解決並行多運動目標的跟蹤問題。
辦公自動化
Hough變換在許多應用系統中得到了很好的應用。例如採用Hough變換進行英文字元特徵提取並自動識別,其對印刷體字元識別率為99.6%,對手寫體字元的平均識別率也達到了86.9%,並已成功應用於郵政信件的自動分揀、文件處理等。 由以上分析可見,Hough變換有著廣泛的關注程度以及良好的應用前景。在計算機視覺和自動目標識別系統中,Hough變換是一個用於邊緣線條特徵提取的強有力工具。編輯本段不足之處本課題的研究內容,如上所述,常規Hough變換雖然具有顯著的優勢,但其不足也不容忽視,如不加改進,有時將會令人無所適從,例如檢測速度太慢,無法做到實時控制;精度不夠高,期望的信息檢測不到反而做出錯誤判斷,進而產生大量的冗餘數據。就圓檢測而言,常規Hough變換的不足主要有以下幾點: 1、參數由直線的兩個參數,即截距和斜率,上升到三個,即圓心坐標和半徑,每個點映射成參數空間的一個曲面,是一到多映射,因而計算量急劇增大; 2、需佔用大量內存空間,耗時久、實時性差; 3、現實中的圖像一般都受到外界雜訊的干擾,信噪比較低,此時常規Hough變換的性能將急劇下降,進行參數空間極大值的搜索時由於合適的閾值難以確定,往往出現「虛峰」和「漏檢」的問題。 本課題針對以上問題展開。由於前人已做出相當的努力,時下,Hough變換的改進演算法門類眾多,在此僅選擇一種相對主流的改進方向,即隨機Hough變換(RHT)加以深入研究,並與常規Hough變換相對比,進而分析它的性能特點。盡管RHT也存在明顯的缺陷,針對它也有許多改進演算法,但由於時間精力有限,暫時無法得到最完美的效果,但是在檢測的圓比較少、邊緣提取效果比較好的情況下,該演算法還是非常有效的。
『叄』 c# 中關於角度計算的hough演算法
/// <summary>
/// 檢測直線
/// </summary>
/// <param name="cross_num">hough變換後的曲線交點個數,取值越大,找出的直線越少</param>
public Bitmap hough_line(Bitmap bmpobj, int cross_num)
{
int x = bmpobj.Width;
int y = bmpobj.Height;
int rho_max = (int)Math.Floor(Math.Sqrt(x*x+y*y))+1; //由原圖數組坐標算出ρ最大值,並取整數部分加1
//此值作為ρ,θ坐標系ρ最大值
int[,] accarray = new int[rho_max,180]; //定義ρ,θ坐標系的數組,初值為0。
//θ的最大值,180度
double[] Theta = new double[180];
//定義θ數組,確定θ取值范圍
double i = 0;
for (int index = 0; index < 180; index++)
{
Theta[index] = i;
i += Math.PI/180;
}
double rho;
int rho_int;
for (int n = 0; n < x; n++)
{
for (int m = 0; m < y; m++)
{
Color pixel = bmpobj.GetPixel(n, m);
if (pixel.R == 0)
{
for (int k = 0; k < 180; k++)
{
//將θ值代入hough變換方程,求ρ值
rho = (m * Math.Cos(Theta[k])) + (n * Math.Sin(Theta[k]));
//將ρ值與ρ最大值的和的一半作為ρ的坐標值(數組坐標),這樣做是為了防止ρ值出現負數
rho_int = (int)Math.Round(rho / 2 + rho_max / 2);
//在ρθ坐標(數組)中標識點,即計數累加
accarray[rho_int, k] = accarray[rho_int, k] + 1;
}
}
}
}
//=======利用hough變換提取直線======
//尋找100個像素以上的直線在hough變換後形成的點
const int max_line = 100;
int[] case_accarray_n = new int[max_line];
int[] case_accarray_m = new int[max_line];
int K=0; //存儲數組計數器
for (int rho_n = 0; rho_n < rho_max; rho_n++) //在hough變換後的數組中搜索
{
for (int theta_m = 0; theta_m < 180; theta_m++)
{
if (accarray[rho_n, theta_m] >= cross_num && K < max_line) //設定直線的最小值
{
case_accarray_n[K]=rho_n; //存儲搜索出的數組下標
case_accarray_m[K]=theta_m;
K=K+1;
}
}
}
//把這些點構成的直線提取出來,輸出圖像數組為I_out
//I_out=ones(x,y).*255;
Bitmap I_out = new Bitmap(x, y);
for (int n = 0; n < x; n++)
{
for (int m = 0; m < y; m++)
{
//首先設置為白色
I_out.SetPixel(n, m, Color.White);
Color pixel = bmpobj.GetPixel(n, m);
if ( pixel.R == 0)
{
for ( int k = 0; k < 180; k++)
{
rho=(m*Math.Cos(Theta[k]))+(n*Math.Sin(Theta[k]));
rho_int=(int)Math.Round(rho/2+rho_max/2);
//如果正在計算的點屬於100像素以上點,則把它提取出來
for ( int a = 0; a < K-1; a++)
{
if (rho_int==case_accarray_n[a] && k==case_accarray_m[a])
I_out.SetPixel(n, m, Color.Black);
}
}
}
}
}
return I_out;
}
相關代碼附上。有問題問我。。
『肆』 Hough變換的演算法步驟
傳統的hough變換計算量大,而且速度慢,所以我採用按照已有演算法進行的。雖然對演算法理解了,但是由於編程圖像變成黑白的,只提取段落的邊界,應該會快一些
『伍』 急求用c或c++實現直線檢測的hough變換源代碼
Hough變換是圖像處理中從圖像中識別幾何形狀的基本方法之一。Hough變換的基本原理在於利用點與線的對偶性,將原始圖像空間的給定的曲線通過曲線表達形式變為參數空間的一個點。這樣就把原始圖像中給定曲線的檢測問題轉化為尋找參數空間中的峰值問題。也即把檢測整體特性轉化為檢測局部特性。比如直線、橢圓、圓、弧線等。
Hough變換的基本思想
設已知一黑白圖像上畫了一條直線,要求出這條直線所在的位置。我們知道,直線的方程可以用y=k*x+b 來表示,其中k和b是參數,分別是斜率和截距。過某一點(x0,y0)的所有直線的參數都會滿足方程y0=kx0+b。即點(x0,y0)確定了一族直線。方程y0=kx0+b在參數k--b平面上是一條直線,(你也可以是方程b=-x0*k+y0對應的直線)。這樣,圖像x--y平面上的一個前景像素點就對應到參數平面上的一條直線。我們舉個例子說明解決前面那個問題的原理。設圖像上的直線是y=x, 我們先取上面的三個點:A(0,0), B(1,1), C(22)。可以求出,過A點的直線的參數要滿足方程b=0, 過B點的直線的參數要滿足方程1=k+b, 過C點的直線的參數要滿足方程2=2k+b, 這三個方程就對應著參數平面上的三條直線,而這三條直線會相交於一點(k=1,b=0)。 同理,原圖像上直線y=x上的其它點(如(3,3),(4,4)等) 對應參數平面上的直線也會通過點(k=1,b=0)。這個性質就為我們解決問題提供了方法,就是把圖像平面上的點對應到參數平面上的線,最後通過統計特性來解決問題。假如圖像平面上有兩條直線,那麼最終在參數平面上就會看到兩個峰值點,依此類推。
簡而言之,Hough變換思想為:在原始圖像坐標系下的一個點對應了參數坐標系中的一條直線,同樣參數坐標系的一條直線對應了原始坐標系下的一個點,然後,原始坐標系下呈現直線的所有點,它們的斜率和截距是相同的,所以它們在參數坐標系下對應於同一個點。這樣在將原始坐標系下的各個點投影到參數坐標系下之後,看參數坐標系下有沒有聚集點,這樣的聚集點就對應了原始坐標系下的直線。
首先,初始化一塊緩沖區,對應於參數平面,將其所有數據置為0.對於圖像上每一前景點,求出參數平面對應的直線,把這直線上的所有點的值都加1。最後,找到參數平面上最大點的位置,這個位置就是原圖像上直線的參數。
在實際應用中,y=k*x+b形式的直線方程沒有辦法表示x=c形式的直線(這時候,直線的斜率為無窮大)。所以實際應用中,是採用參數方程p=x*cos(theta)+y*sin(theta)。這樣,圖像平面上的一個點就對應到參數p---theta平面上的一條曲線上,其它的還是一樣。
Hough變換推廣
1、已知半徑的圓
其實Hough變換可以檢測任意的已知表達形式的曲線,關鍵是看其參數空間的選擇,參數空間的選擇可以根據它的表達形式而定。比如圓的表達形式為,所以當檢測某一半徑的圓的時候,可以選擇與原圖像空間同樣的空間作為參數空間。那麼圓圖像空間中的一個圓對應了參數空間中的一個點,參數空間中的一個點對應了圖像空間中的一個圓,圓圖像空間中在同一個圓上的點,它們的參數相同即a,b相同,那麼它們在參數空間中的對應的圓就會過同一個點(a,b),所以,將原圖像空間中的所有點變換到參數空間後,根據參數空間中點的聚集程度就可以判斷出圖像空間中有沒有近似於圓的圖形。如果有的話,這個參數就是圓的參數。
2、未知半徑的圓對於圓的半徑未知的情況下,可以看作是有三個參數的圓的檢測,中心和半徑。這個時候原理仍然相同,只是參數空間的維數升高,計算量增大。圖像空間中的任意一個點都對應了參數空間中的一簇圓曲線。,其實是一個圓錐型。參數空間中的任意一個點對應了圖像空間中的一個圓。
3、橢圓橢圓有5個自由參數,所以它的參數空間是5維的,因此他的計算量非常大,所以提出了許多的改進演算法。
圖像空間中的在同一個圓,直線,橢圓上的點,每一個點都對應了參數空間中的一個圖形,在圖像空間中這些點都滿足它們的方程這一個條件,所以這些點,每個投影後得到的圖像都會經過這個參數空間中的點。也就是在參數空間中它們會相交於一點。所以,當參數空間中的這個相交點的越大的話,那麼說明元圖像空間中滿足這個參數的圖形越飽滿。越象我們要檢測的東西。 Hough變換能夠查找任意的曲線,只要你給定它的方程。Hough變換在檢驗已知形狀的目標方面具有受曲線間斷影響小和不受圖形旋轉的影響的優點,即使目標有稍許缺損或污染也能被正確識別。
『陸』 Hough變換演算法檢測特定長度的直線
I=imread('圖像名稱』);
figure;imshow(I);title('原圖')
I=double(I);
BW=edge(I,'canny');
[A,B,C]=hough(BW);
imshow(A,[],'XData',B,'Ydata',C,'InitialMagnification','fit'); title('hough變換圖像')
xlabel('\theta'), ylabel('\rho');
axis normal,hold on;
P=houghpeaks(A,5);
x=B(P(:,2));y=C(P(:,1));
plot(x,y,'s','color','white');
lines=houghlines(O,B,C,P);
figure,imshow(N),hold on
max_len=0;
for k=1:要檢測的長度值
xy=[lines(k).point1;lines(k).point2];
plot(xy(:,1),xy(:,2),'color','green');
plot(xy(1,1),xy(1,2),'color','yellow');
plot(xy(2,1),xy(2,2),'color','red');
len=norm(lines(k).point1-lines(k).point2);
if (len>max_len)
max_len=len;
xy_long=xy;
end
end
plot(xy_long(:,1),xy_long(:,2),'color','cyan');
『柒』 霍夫變換的介紹
原理簡介 霍夫變換(Hough Transform) 霍夫變換是圖像處理中從圖像中識別幾何形狀的基本方法之一,應用很廣泛,也有很多改進演算法。主要用來從圖像中分離出具有某種相同特徵的幾何形狀(如,直線,圓等)。最基本的霍夫變換是從黑白圖像中檢測直線(線段)。
『捌』 霍夫 變換和最小二乘法有什麼區別
它們是算不同的是東西,得到的解也不同。
霍夫變換: 霍夫變換是圖像處理中從圖像中識別幾何形狀的基本方法之一,應用很廣泛,也有很多改進演算法。主要用來從圖像中分離出具有某種相同特徵的幾何形狀(如,直線,圓等)。最基本的霍夫變換是從黑白圖像中檢測直線(線段)。
最小二乘法:又稱最小平方法是一種數學優化技術。它通過最小化誤差的平方和尋找數據的最佳函數匹配。利用最小二乘法可以簡便地求得未知的數據,並使得這些求得的數據與實際數據之間誤差的平方和為最小。最小二乘法還可用於曲線擬合。其他一些優化問題也可通過最小化能量或最大化熵用最小二乘法來表達。
『玖』 請問誰知道概率霍夫變換的原理是什麼嗎
霍夫變換(Hough Transform)
霍夫變換是圖像處理中從圖像中識別幾何形狀的基本方法之一,應用很廣泛,也有很多改進演算法。最基本的霍夫變換是從黑白圖像中檢測直線(線段)。我們先看這樣一個問題:設已知一黑白圖像上畫了一條直線,要求出這條直線所在的位置。我們知道,直線的方程可以用y=k*x+b 來表示,其中k和b是參數,分別是斜率和截距。過某一點(x0,y0)的所有直線的參數都會滿足方程y0=kx0+b。即點(x0,y0)確定了一族直線。方程y0=kx0+b在參數k--b平面上是一條直線,(你也可以是方程b=-x0*k+y0對應的直線)。這樣,圖像x--y平面上的一個前景像素點就對應到參數平面上的一條直線。我們舉個例子說明解決前面那個問題的原理。設圖像上的直線是y=x, 我們先取上面的三個點:A(0,0), B(1,1), C(22)。可以求出,過A點的直線的參數要滿足方程b=0, 過B點的直線的參數要滿足方程1=k+b, 過C點的直線的參數要滿足方程2=2k+b, 這三個方程就對應著參數平面上的三條直線,而這三條直線會相交於一點(k=1,b=0)。 同理,原圖像上直線y=x上的其它點(如(3,3),(4,4)等) 對應參數平面上的直線也會通過點(k=1,b=0)。這個性質就為我們解決問題提供了方法:
首先,我們初始化一塊緩沖區,對應於參數平面,將其所有數據置為0.
對於圖像上每一前景點,求出參數平面對應的直線,把這直線上的所有點的值都加1。最後,找到參數平面上最大點的位置,這個位置就是原圖像上直線的參數。上面就是霍夫變換的基本思想。就是把圖像平面上的點對應到參數平面上的線,最後通過統計特性來解決問題。假如圖像平面上有兩條直線,那麼最終在參數平面上就會看到兩個峰值點,依此類推。
在實際應用中,y=k*x+b形式的直線方程沒有辦法表示x=c形式的直線(這時候,直線的斜率為無窮大)。所以實際應用中,是採用參數方程p=x*cos(theta)+y*sin(theta)。這樣,圖像平面上的一個點就對應到參數p---theta平面上的一條曲線上。其它的還是一樣。
在看下面一個問題:我們要從一幅圖像中檢測出半徑以知的圓形來。這個問題比前一個還要直觀。我們可以取和圖像平面一樣的參數平面,以圖像上每一個前景點為圓心,以已知的半徑在參數平面上畫圓,並把結果進行累加。最後找出參數平面上的峰值點,這個位置就對應了圖像上的圓心。在這個問題里,圖像平面上的每一點對應到參數平面上的一個圓。
把上面的問題改一下,假如我們不知道半徑的值,而要找出圖像上的圓來。這樣,一個辦法是把參數平面擴大稱為三維空間。就是說,參數空間變為x--y--R三維,對應圓的圓心和半徑。
圖像平面上的每一點就對應於參數空間中每個半徑下的一個圓,這實際上是一個圓錐。最後當然還是找參數空間中的峰值點。不過,這個方法顯然需要大量的內存,運行速度也會是很大問題。有什麼更好的方法么?我們前面假定的圖像都是黑白圖像(2值圖像),實際上這些2值圖像多是彩色或灰度圖像通過邊緣提取來的。我們前面提到過,圖像邊緣除了位置信息,還有方向信息也很重要,這里就用上了。根據圓的性質,圓的半徑一定在垂直於圓的切線的直線上,也就是說,在圓上任意一點的法線上。這樣,解決上面的問題,我們仍採用2維的參數空間,對於圖像上的每一前景點,加上它的方向信息,都可以確定出一條直線,圓的圓心就在這條直線上。這樣一來,問題就會簡單了許多。
接下來還有許多類似的問題,如檢測出橢圓,正方形,長方形,圓弧等等。這些方法大都類似,關鍵就是需要熟悉這些幾何形狀的數學性質。霍夫變換的應用是很廣泛的,比如我們要做一個支票識別的任務,假設支票上肯定有一個紅顏色的方形印章,我們可以通過霍夫變換來對這個印章進行快速定位,在配合其它手段進行其它處理。霍夫變換由於不受圖像旋轉的影響,所以很容易的可以用來進行定位。
霍夫變換有許多改進方法,一個比較重要的概念是廣義霍夫變換,它是針對所有曲線的,用處也很大。就是針對直線的霍夫變換也有很多改進演算法,比如前面的方法我們沒有考慮圖像上的這一直線上的點是否連續的問題,這些都要隨著應用的不同而有優化的方法。
『拾』 運用matlab實現Hough變換檢測圓的演算法 裡面哪裡有錯誤幫忙看看
這程序調試後檢測出來不是圓的檢測,是邊緣檢測