hough變換檢測直線java(hough變換檢測直線matlab)

本文目錄一覽:

Hough變換

Hough變換是利用圖像全局特性有可能把邊緣象素連接起來組成區域封閉邊界的一種方法。在預先知道區域形狀的條件下,利用Hough變換可以方便地得到邊界曲線,把不連續的邊緣象素點連接起來,還可以直接檢測某些已知形狀的目標,並有可能確定邊界到亞象元精度。其主要優點是受噪聲和曲線間斷的影響小。為了便於理解Hough變換這種功能,先舉一個簡單例子。設給定圖像中的n個點,要從中確定連在同一直線上的點的子集。這可看作已檢測出的若干點,去求出它們所在的直線。一種直接解決辦法是先確定所有由任意兩點決定的直線(約需n2次運算以確定n(n-1)/2 條直線),再找出接近具體直線的點的集合(約需n2次運算以比較n個點中的每一個與n(n-1)/2條直線中的每一條)。這麼大的計算量實際上不易實現。如果用Hough變換:的方法就可用較少的計算量來解決這個問題。這種變換的基本思想是點一線的對偶性,Duality在圖像空間XY中,所有過點(x,y)的直線都滿足方程:

Y=px + q (5-15)

式中P為斜率,q為截距,式(5-15)也可以寫成:

q=- px + Y (5-16)

式(5-16)可以認為是代表參數空間PQ中過點(p,q)的一條直線。

現在來看圖5-9a表示圖像空間,(b)表示參數空間。在圖像空間XY中,過點(xi,yi)的通用直線方程按式(5-15)可寫為yi=pxi+q,也可以按式(5-16)寫為q=-pxi+yi;它表示在參數空間PQ里的另一條直線。設這兩條直線在參數空間PQ里相交於點(p′,q′),這裡點(p′,q′)對應圖像空間XY中一條過點(xi,yi)和(xi,yi)的直線,因此在圖像空間XY中過點(xi,yi)和(xj,yj)的直線上的每個點都對應在參數空間PQ里的一條直線,這條直線相交於點(p′,q′)。

由此可知,在圖像空間中共線的點對應在參數空間里相交的線。反過來在參數空間中相交於同一個點的所有直線在圖像空間里都有共線的點與之對應。這就是點線對偶性。Hough變換就是根據這些關係把在圖像空間中的檢測問題轉換到參數空間里,通過較簡單的累加統計完成檢測任務。

在具體計算時需要在參數空間PQ里建立一個二維累加數組。設這個累加數組為A(p,q),如圖5-10所示。其中[Pmin,Pmax]和[qmin,qmax]分別為預期的斜率和截距的取值範圍。開始時置數組A為零,然後對每一個圖像空間中的給定點,讓p取遍p軸上所有可能的值,並根據式(5-16)算出對應的q,再根據p和q的值(設都已經取整)對A累加:A(p,q)=A(p,q)+1,累加結束後,根據A(p,q)的值就可知道有多少點是共線的,即A(p,q)的值就是在(p,q)處共線點的個數。同時(p,q)值也給出了直線方程的參數,於是我們得到了點所在的線。

圖5-9 圖像空間和參數空間中點和線的對偶性

圖5-10 參數空間里的累加數組示意圖

假設我們把P軸分成K份,即P取K個值,那麼對每一個點(xk,yk)由式(5-16)可得到q的K個值。因為圖中有n個點,所以這裡就需要nK次運算。可見運算量是n的線性函數。如果K比n小,則總計算量必小於n2,這就是Hough變換的優勢所在。

Hough變換不僅可用來檢測直線和連接處在同一條直線上的點,也可以用來檢測滿足解析式f(x,c)=0形式的各類曲線並把曲線上的點連接起來。這裡x是一個坐標矢量,在二維圖像中是一個二維矢量,c是一個係數矢量,它可以根據曲線的不同,從二維、三維到四維等,凡能寫出方程的圖形,都可以利用Hough變換來檢測。

自然界有許多要素有一定的形狀、分布與伸展方向,但可能受其他因素遮蔽而顯現得不清晰或斷斷續續,例如,地質體的線性構造、環形構造等,在地質探礦、地質穩定性分析等方面都有重要意義,可是在遙感圖像上有時反映得不太清楚,如果借鑒Hough變換的基本思想來處理圖像,可能有助於構造信息的提取。

hough變換檢測直線 怎麼確定直線的端點?

這個問題答案在MATLAB幫助文檔里有介紹。在help里搜索houghlines函數。下面的程序是我從幫助文檔里複製過來的,程序的最後是顯示出直線的起點和終點。希望幫到你。

I = imread(‘circuit.tif’);

rotI = imrotate(I,33,’crop’);

BW = edge(rotI,’canny’);

[H,T,R] = hough(BW);

imshow(H,[],’XData’,T,’YData’,R,…

‘InitialMagnification’,’fit’);

xlabel(‘\theta’), ylabel(‘\rho’);

axis on, axis normal, hold on;

P = houghpeaks(H,5,’threshold’,ceil(0.3*max(H(:))));

x = T(P(:,2)); y = R(P(:,1));

plot(x,y,’s’,’color’,’white’);

% Find lines and plot them

lines = houghlines(BW,T,R,P,’FillGap’,5,’MinLength’,7);

figure, imshow(rotI), hold on

max_len = 0;

for k = 1:length(lines)

xy = [lines(k).point1; lines(k).point2];

plot(xy(:,1),xy(:,2),’LineWidth’,2,’Color’,’green’);

% Plot beginnings and ends of lines%答案在這裡

plot(xy(1,1),xy(1,2),’x’,’LineWidth’,2,’Color’,’yellow’);

plot(xy(2,1),xy(2,2),’x’,’LineWidth’,2,’Color’,’red’);

如何用Hough變換檢測一幅二值圖像中的最長直線

樓主可以試一下這段代碼,希望能對你有幫助

I = imread(‘E:\pic\2\編號\4.bmp’);%讀取圖像

rotI = imrotate(I,-4,’crop’);%圖像旋轉33°

subplot(221),

fig1 = imshow(I);%在第一幅子圖中繪製旋轉後的圖像

BW = edge(I,’canny’);%使用canny方法檢測目標邊界

subplot(222),

imshow(BW);%顯示邊界的二值圖像

[H,theta,rho] = hough(BW);%hough變換

subplot(223),

imshow(imadjust(mat2gray(H)),[],’XData’,theta,’YData’,rho,…

‘InitialMagnification’,’fit’);%顯示hough變換的變換矩陣

xlabel(‘\theta (degrees)’), ylabel(‘\rho’);

axis on, axis normal, hold on;

colormap(hot)%顏色映射表

P = houghpeaks(H,5,’threshold’,ceil(0.3*max(H(:))));%hough變換的極值點

x = theta(P(:,2));

y = rho(P(:,1));

plot(x,y,’s’,’color’,’black’);%畫出極值點

lines = houghlines(BW,theta,rho,P,’FillGap’,…

5,’MinLength’,7);%返回直線的端點%

subplot(224),

imshow(rotI), hold on

max_len = 0;

for k = 1:length(lines)

xy = [lines(k).point1; lines(k).point2];

plot(xy(:,1),xy(:,2),’LineWidth’,2,’Color’,’green’);%檢測到的直線

plot(xy(1,1),xy(1,2),’x’,’LineWidth’,2,…

‘Color’,’yellow’);%起始端點

plot(xy(2,1),xy(2,2),’x’,’LineWidth’,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),’LineWidth’,2,…

‘Color’,’cyan’);%繪製最長的直線

原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/127545.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
簡單一點的頭像簡單一點
上一篇 2024-10-03 23:16
下一篇 2024-10-03 23:16

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Python OpenCV 直線檢測

    本文將介紹在Python OpenCV中進行直線檢測的方法,主要涉及到圖像的邊緣檢測、霍夫變換和繪製直線等操作。 一、邊緣檢測 由於直線檢測是從圖像的邊緣開始的,因此必須先找到圖像…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論