OpenCV-Python中的圖像處理-霍夫變換

OpenCV-Python中的圖像處理-霍夫變換

  • 霍夫變換
    • 霍夫直線變換
    • 霍夫圓環變換

霍夫變換

  • 霍夫(Hough)變換在檢測各種形狀的技術中非常流行,如果要檢測的形狀可以用數學表達式描述,就可以是使用霍夫變換檢測它。即使要檢測的形狀存在一點破壞或者扭曲也是可以使用。

霍夫直線變換

  1. Hough直線變換,可以檢測一張圖像中的直線
  2. cv2.HoughLines(image, rho, theta, threshold)
    • return:返回值就是( ρ, θ)。 ρ 的單位是像素, θ 的單位是弧度。
    • image:是一個二值化圖像,所以在進行霍夫變換之前要首先進行二值化,或者進行Canny 邊緣檢測。
    • rho:代表 ρ 的精確度。
    • theta:代表θ 的精確度。
    • threshold:閾值,只有累加其中的值高于閾值時才被認為是一條直線,也可以把它看成能檢測到的直線的最短長度(以像素點為單位)。
  3. cv2.HoughLinesP(image: Mat, rho, theta, threshold, lines=…, minLineLength=…, maxLineGap=…)
    • return :返回值就是直線的起點和終點(x1,y1,x2,y2)。
    • rho:代表 ρ 的精確度。
    • theta:代表θ 的精確度。
    • threshold:閾值,只有累加其中的值高于閾值時才被認為是一條直線,也可以把它看成能檢測到的直線的最短長度(以像素點為單位)。
    • minLineLength:直線的最短長度。比這個短的線都會被忽略。
    • maxLineGap- 兩條線段之間的最大間隔,如果小于此值,這兩條直線就被看成是一條直線。
  4. 一條直線可以用數學表達式 y = mx + c 或者 ρ = x cos θ + y sin θ 表示。ρ 是從原點到直線的垂直距離, θ 是直線的垂線與橫軸順時針方向的夾角(如果使用的坐標系不同,方向也可能不同,這里是按 OpenCV 使用的坐標系描述的)。如下圖所示:
    在這里插入圖片描述
import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/sudoku.png', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)lines = cv2.HoughLines(edges, 1, np.pi/180, 200)for i in range(len(lines)):
# for rho, thetha in lines[10]:rho = lines[i][0][0]thetha = lines[i][0][1]a = np.cos(thetha)b = np.sin(thetha)x0 = a*rhoy0 = b*rholine_length = 1000 # 線長x1 = int(x0 + line_length*(-b))y1 = int(y0 + line_length*(a))x2 = int(x0 - line_length*(-b))y2 = int(y0 - line_length*(a))cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 1)# 因為gray和edges都是單通道的,為了可以和原圖拼接合并,需要merge成3通道圖像數據
gray = cv2.merge((gray, gray, gray))
edges = cv2.merge((edges,edges,edges))# 圖像拼接
res = np.hstack((gray,edges,img))cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這里插入圖片描述
漸進概率式霍夫變換
cv2.HoughLinesP(image: Mat, rho, theta, threshold, lines=…, minLineLength=…, maxLineGap=…)

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/sudoku.png', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray, 50, 150, apertureSize=3)minLineLength = 100
maxLineGap = 10
# HoughLinesP(image: Mat, rho, theta, threshold, lines=..., minLineLength=..., maxLineGap=...) 
lines = cv2.HoughLinesP(canny, 1, np.pi/180, 100, minLineLength, maxLineGap)print(lines.shape)
print(lines[0])for i in range(len(lines)):for x1,y1,x2,y2 in lines[i]:cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 1)gray = cv2.merge((gray, gray, gray))
canny = cv2.merge((canny,canny,canny))res = np.hstack((gray, canny, img))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這里插入圖片描述
在含有坐標點集合中尋找是否存在直線:
cv2.HoughLinesPointSet(_point, lines_max, threshold, min_rho, max_rho, rho_step, min_theta, max_theta, theta_step, _lines=…)

  • _point:輸入點的集合,必須是平面內的2D坐標,數據類型必須是CV_32FC2或CV_32SC2。
  • lines_max:檢測直線的最大數目。
  • threshold:累加器的閾值,即參數空間中離散化后每個方格被通過的累計次數大于閾值時則被識別為直線,否則不被識別為直線。
  • min_rho:檢測直線長度的最小距離,以像素為單位。
  • max_rho:檢測直線長度的最大距離,以像素為單位。
  • rho_step::以像素為單位的距離分辨率,即距離 離散化時的單位長度。
  • min_theta:檢測直線的最小角度值,以弧度為單位。
  • max_theta:檢測直線的最大角度值,以弧度為單位。
  • theta_step:以弧度為單位的角度分辨率,即夾角 離散化時的單位角度。
  • _lines:在輸入點集合中可能存在的直線,每一條直線都具有三個參數,分別是權重、直線距離坐標原點的距離 和坐標原點到直線的垂線與x軸的夾角 。

霍夫圓環變換

  1. 圓形的數學表達式為 (x ? xcenter)2+(y ? ycenter)2 = r2,其中( xcenter,ycenter)為圓心的坐標, r 為圓的直徑。從這個等式中我們可以看出:一個圓環需要 3個參數來確定。所以進行圓環霍夫變換的累加器必須是 3 維的,這樣的話效率就會很低。所以 OpenCV 用來一個比較巧妙的辦法,霍夫梯度法,它可以使用邊界的梯度信息。
  2. cv2.HoughCircles(image, method, dp, minDist, circles=…, param1=…, param2=…, minRadius=…, maxRadius=…)
    • return:存儲檢測到的圓的輸出矢量。
    • image:輸入圖像,數據類型一般用Mat型即可,需要是8位單通道灰度圖像
    • method:使用的檢測方法,cv2.HOUGH_GRADIENT,cv2.HOUGH_GRADIENT_ALT。
    • dp:double類型的dp,用來檢測圓心的累加器圖像的分辨率于輸入圖像之比的倒數,且此參數允許創建一個比輸入圖像分辨率低的累加器。上述文字不好理解的話,來看例子吧。例如,如果dp= 1時,累加器和輸入圖像具有相同的分辨率。如果dp=2,累加器便有輸入圖像一半那么大的寬度和高度。
    • minDist:為霍夫變換檢測到的圓的圓心之間的最小距離。
    • circles:可以忽略,存儲檢測到的圓的輸出矢量。
    • param1:它是第三個參數method設置的檢測方法的對應的參數。它表示傳遞給canny邊緣檢測算子的高閾值,而低閾值為高閾值的一半。
    • param2:也是第三個參數method設置的檢測方法的對應的參數,它表示在檢測階段圓心的累加器閾值。它越小的話,就可以檢測到更多根本不存在的圓,而它越大的話,能通過檢測的圓就更加接近完美的圓形了。
    • minRadius:表示圓半徑的最小值。
    • maxRadius:表示圓半徑的最大值。
import numpy as np
import cv2img = cv2.imread('./resource/opencv/image/logo/opencv-logo2.png', cv2.IMREAD_GRAYSCALE)
img = cv2.medianBlur(img, 5)
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=30, maxRadius=0)print(circles)
circles = np.uint16(circles)
print(circles)for i in circles[0, :]:cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)cv2.imshow('detected circles', cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39245.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39245.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39245.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【1day】復現大華智慧園區綜合管理平臺SQL注入漏洞

目錄 一、漏洞描述 二、影響版本 三、資產測繪 四、漏洞復現 一、漏洞描述 大華智慧園區綜合管理平臺是一個集智能化、信息化、網絡化、安全化為一體的智慧園區管理平臺,旨在為園區提供一站式解決方案,包括安防、能源管理、環境監測、人員管理、停車管理等多個方面。大華…

【C/C++】關于C++構造函數成員初始化

文章目錄 1. 第一種方式2. 第二種方式3. 優劣 1. 第一種方式 成員初始化列表。在構造函數的參數列表后使用冒號分割的一組初始化語句。 class my_class { public:my_class(int a, int b): m_x(a), m_y(b) {/*....*/} private:int m_x;int m_y; };2. 第二種方式 在構造函數內…

【skynet】skynet 服務間通信

寫在前面 skynet 服務之間有自己的一套高效通信 API 。本文給出簡單的示例。 文章目錄 寫在前面準備工作編寫代碼運行結果 準備工作 首先要有一個編譯好,而且工作正常的 skynet 。 編寫代碼 在 skynet/example 目錄編寫一個配置文件,兩個代碼文件。 …

(7)(7.1) 使用航點和事件規劃任務

文章目錄 前言 7.1.1 設置Home位置 7.1.2 視頻:制作并保存多路點任務 7.1.3 視頻:加載已保存的多航點任務 7.1.4 使用說明 7.1.5 提示 7.1.6 自動網格 7.1.7 任務指令 7.1.8 任務結束 7.1.9 任務重置 7.1.10 MIS_OPTIONS 7.1.11 任務再出發 …

renderdoc源碼分析(四) 重放

//TODO 先貼下飛書文檔,后續找時間再整理到這 Docs

04 - 分離頭指針情況、理解HEAD和branch

查看所有文章鏈接:(更新中)GIT常用場景- 目錄 文章目錄 1. 分離頭指針2. HEAD和branch2.1 branch的一些操作2.2 HEAD 1. 分離頭指針 分離頭指針detached HEAD是一種HEAD指針指向了某一個具體的 commit id,而不是分支的情況。 切換…

springboot 使用zookeeper實現分布式ID

添加ZooKeeper依賴&#xff1a;在pom.xml文件中添加ZooKeeper客戶端的依賴項。例如&#xff0c;可以使用Apache Curator作為ZooKeeper客戶端庫&#xff1a; <dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</arti…

Faiss在windows下安裝和使用

pip install faiss-cpu 直接安裝可能出現問題&#xff1a; error: command swig.exe failed: No such file or directory 安裝swig即可解決&#xff0c;安裝方式

學習Vue:Event Bus 與 Provide/Inject

在Vue.js中&#xff0c;兄弟組件通信是指兩個沒有直接父子關系的組件之間如何進行數據傳遞和通信。為了實現兄弟組件通信&#xff0c;我們可以借助Vue的一些特性&#xff0c;如Event Bus和Provide/Inject。讓我們一起來深入了解這些方法&#xff0c;并通過實例來看看如何實現兄…

服務器如何防止cc攻擊

對于搭載網站運行的服務器來說&#xff0c;cc攻擊應該并不陌生&#xff0c;特別是cc攻擊的攻擊門檻非常低&#xff0c;有個代理IP工具&#xff0c;有個cc攻擊軟件就可以輕易對任何網站發起攻擊&#xff0c;那么服務器如何防止cc攻擊?請看下面的介紹。 服務器如何防止cc攻擊&a…

希爾排序【Java算法】

文章目錄 1. 概念2. 思路3. 代碼實現 1. 概念 希爾排序也是一種插入排序&#xff0c;它是簡單插入排序經過改進之后的一個更高效的版本&#xff0c;也稱為縮小增量排序。希爾排序在數組中采用跳躍式分組的策略&#xff0c;通過某個增量將數組元素劃分為若干組&#xff0c;然后分…

iOS學習—制作全局遮罩

在.h文件中線聲明show()方法 - (void)show; .m文件中添加全屏遮罩&#xff0c;在遮罩上添加了一個選擇框并添加了底部彈出的動畫&#xff0c;可自行在其中添加tableview、pickerview等其他視圖&#xff0c;并添加了點擊選擇框視圖外區域隱藏 #import "MaskView.h"…

Java:PO、VO、BO、DO、DAO、DTO、POJO

&#x1f497;wei_shuo的個人主頁 &#x1f4ab;wei_shuo的學習社區 &#x1f310;Hello World &#xff01; Java&#xff1a;PO、VO、BO、DO、DAO、DTO、POJO PO持久化對象&#xff08;Persistent Object&#xff09; PO是持久化對象&#xff0c;用于表示數據庫中的實體或表…

tauri-vue:快速開發跨平臺軟件的架子,支持自定義頭部UI拖拽移動和窗口陰影效果

Tauri Vue Typescript 一個使用 taurivuets 開發跨平臺軟件的模板&#xff0c;支持窗口頭部自定義 UI 和拖拽和窗口陰影&#xff0c;不用再自己做適配了&#xff0c;拿來即用&#xff0c;非常 nice。而且已經封裝好了 tauri 的 http 請求工具&#xff0c;省去很多彎路。開源…

分布式 - 消息隊列Kafka:Kafka消費者分區再均衡(Rebalance)

文章目錄 01. Kafka 消費者分區再均衡是什么&#xff1f;02. Kafka 消費者分區再均衡的觸發條件&#xff1f;03. Kafka 消費者分區再均衡的過程&#xff1f;04. Kafka 如何判定消費者已經死亡&#xff1f;05. Kafka 如何避免消費者的分區再均衡?06. Kafka 消費者分區再均衡有什…

UglifyJS 和JShaman相比有什么不同?都可以進行js混淆加密嗎?

UglifyJS 和JShaman相比有什么不同&#xff1f; UglifyJS主要功能是壓縮JS代碼&#xff0c;減小代碼體積&#xff1b;JShaman是專門用于對JS代碼混淆加密&#xff0c;目的是讓JS代碼變的不可讀、混淆功能邏輯、加密代碼中的隱秘數據或字符&#xff0c;是用于代碼保護的。 因此…

java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration

錯誤&#xff1a; java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfigurationat org.apache.hadoop.hive.ql.exec.tez.TezSessionPoolSession$AbstractTriggerValidator.startTriggerValidator(TezSessionPoolSession.java:74)at org.apache.hadoop.hive.ql.e…

音視頻技術開發周刊 | 306

每周一期&#xff0c;縱覽音視頻技術領域的干貨。 新聞投稿&#xff1a;contributelivevideostack.com。 人工智能研究人員聲稱&#xff0c;通過Zoom音頻檢測擊鍵的準確率為93% 通過記錄按鍵并訓練深度學習模型&#xff0c;三位研究人員聲稱&#xff0c;基于單個按鍵的聲音特征…

eclipse 導入項目js報錯問題

eclipse 導入項目后會出現項目中的js文件報錯&#xff08;紅叉&#xff09;&#xff0c;如下圖所示&#xff0c;有時候報錯的文件很多&#xff0c;需要集中處理。 解決辦法&#xff1a; 右鍵項目名稱》Properties》MyEclipse》JavaScript》Include Path&#xff0c;在右側選擇“…

vim鍵盤圖

國外&#xff1a;http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html&#xff0c;原創&#xff0c;有SVG圖&#xff0c;有分步驟的圖。 國內翻譯&#xff1a;[https://blog.csdn.net/qq_41052753/article/details/101031847 有幾個配色&#xff0c;很高清&…