首页
/
每日頭條
/
生活
/
基本算法的4個原理
基本算法的4個原理
更新时间:2024-10-04 20:24:07

圖像處理中,檢測直線或者圓等有固定方程式表示的物體時,可以考慮用霍夫變換來做。

對于一個二值圖像,

如下圖:

基本算法的4個原理(簡單霍夫變換的源碼實現)1

這個變換的思路:

1 利用兩點的坐标計算出直線的斜率k和截距b,由于k的取值有無窮大的值,表示起來不方便,所以将k用角度來表示,即arctan(k)得到直線與水平線的夾角。b其實也需要做一些映射,将[負無窮,正無窮]映射到[-N,N] 上。

2 取圖像上任意一對點的坐标,計算他們對應直線的arctan(k), 和b 。不同的一對點,計算得到的arttan(k),b有可能相同,如果兩隊點都共線。

3 假設圖像上有M對點,那麼我們一共得到M個 [arctan(k),b]

4 統計arctan(k)取值 -90度至90度之間,b取值-N,至N之間時,對應于每個特定的[arctan(k),b]的直線數目。比如統計出[arctan(k)=45度,b=0]對應的直線數據,統計出[arctan(k)=-20度,b=35]對應的直線數目。

最終,我們得到一個180*2N的矩陣,如下圖:

基本算法的4個原理(簡單霍夫變換的源碼實現)2

橫軸是b,縱軸是arctan(k)

可以看到,圖片的右下部分最亮,圖像的下邊緣對應的是斜率接近90度的直線,說明原圖中,存在垂直的直線。

圖片的中間部分有數量不多的點,中間部分對應于斜率為零的直線,說明原圖上有一些水平線。

以往都是直接調用opencv庫的,但是有些情況下,是不能調用庫的,必須自己寫了,

下面是我寫的代碼:

60 def get_line_list(point_list): 61 import numpy as np 62 k_dist_list=np.zeros(181) 63 k_b_matrix=np.zeros((181,181)) 64 N=len(point_list) 65 for i in range(0,N): 66 p1 = point_list[i] 67 for j in range(i 1,N): 68 p2 = point_list[j] 69 dist,k,b=get_line_coef_length(p1,p2) 70 if np.abs(b)<=90: 71 k_b_matrix[k,int(b 90)] =1 72 if dist>k_dist_list[k]: 73 k_dist_list[k]=dist 74 return k_dist_list,k_b_matrix

point_list是python中的list,裡面取的就是上面二值圖上所有點的坐标。

63行聲明了一個矩陣:181*181的

69行計算了兩個點p1,p2所在直線的斜率k和截距b,

71行是統計語句,将矩陣中k行,int(b 90)位置 1,遇到斜率為k,截距為int(b 90]的直線時,就在矩陣中相應位置 1.

這裡主要有個函數get_line_coef_length,代碼如下:

44 def get_line_coef_length(p1,p2): 45 import numpy as np 46 x1,y1=p1 47 x2,y2=p2 48 xe=x1-x2 49 ye=y1-y2 50 dist = np.sqrt(xe*xe ye*ye) 51 k=float(y2)-float(y1) 52 if x2-x1==0: 53 return dist,180,y1 54 k=k/(float(x2)-float(x1)) 55 k_theta = int(np.arctan(k)/3.14*180.0 90.0) 56 b = y1-k*x1 57 #線段長度,角度 58 return dist,k_theta,b

51行--55行是計算斜率的,這裡當斜率為無窮大時,我們将其設定為180,為什麼呢?

因為角度的取值範圍是[-90,90],這個下标是從-90開始的,但是我們矩陣k_b_matrix的下标是從零開始的,所以将[-90,90]映射到了[0,180].

也正是因為如此,在55行,有個 90.0.

這就是霍夫變換了,原理簡答,比形态學的方法找直線好用很多。

需要整份代碼的可以私信我。

另外我這裡有源碼寫的提取聯通區域,計算聯通區域最小外接矩形,沒有調用任何庫,可以寫在任何設備上,需要的話,可以向我咨詢。

我這裡還有幾個例子:

基本算法的4個原理(簡單霍夫變換的源碼實現)3

原圖2

基本算法的4個原理(簡單霍夫變換的源碼實現)4

原圖2對應的霍夫變換

基本算法的4個原理(簡單霍夫變換的源碼實現)5

原圖3

基本算法的4個原理(簡單霍夫變換的源碼實現)6

原圖3對應的霍夫變換

基本算法的4個原理(簡單霍夫變換的源碼實現)7

原圖4

基本算法的4個原理(簡單霍夫變換的源碼實現)8

圖4對應的霍夫變換

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
村上春樹名言名句
村上春樹名言名句
村上春樹名言名句?我這人,無論對什麼,都務必形諸文字,否則就無法弄得水落石出——村上春樹《挪威的森林》,我來為大家講解一下關于村上春樹名言名句?跟着小編一起來看一看吧!村上春樹名言名句我這人,無論對什麼,都務必形諸文字,否則就無法弄得水落石...
2024-10-04
草果和什麼不能一起吃
草果和什麼不能一起吃
草果和什麼不能一起吃?草果是姜科植物草果的幹燥成熟果實,它可單獨整個炖肉吃,也可磨成粉末和其他香料搭配一起做調料,其中整個主要用于炖肉,磨成粉的調味料烹饪其他食物也可用,能與任何食物搭配一起炖煮,并沒有禁忌搭配食物,今天小編就來聊一聊關于草...
2024-10-04
有關有和無的詩句
有關有和無的詩句
有關有和無的詩句?李商隐《無題》:身無彩鳳雙飛翼,心有靈犀一點通,今天小編就來聊一聊關于有關有和無的詩句?接下來我們就一起去研究一下吧!有關有和無的詩句李商隐《無題》:身無彩鳳雙飛翼,心有靈犀一點通。劉禹錫《竹枝詞二首其一》:東邊日出西邊雨...
2024-10-04
柯南和灰原哀被路人誤認為情侶
柯南和灰原哀被路人誤認為情侶
若柯南喜歡上灰原哀,柯南是算不算不負責任?老實說,柯哀和柯蘭兩大黨派之争是很久以前就開始了的,作為早早接觸名偵探柯南的人,我實在是難以想象曾經的推理漫畫發展到了如今的白色相簿魔幻懸疑版。首先,柯南和毛利蘭的羁絆很深,非常深,深到幼兒園的那種...
2024-10-04
臘汁肉夾馍手把手教你做
臘汁肉夾馍手把手教你做
承接上一篇文章前文給大家分享了西安臘汁肉夾馍中饦饦馍的做法,今天來教大家怎麼做臘汁肉!先上圖,大家是不是已經垂涎欲滴咯?臘汁肉最早的記載在戰國時代,被稱為“寒肉”,唐朝時又成其為“臘肉”“暗肉”,之後各朝世代流傳,曆經演變逐漸成為今天的臘汁...
2024-10-04
Copyright 2023-2024 - www.tftnews.com All Rights Reserved