OpenCV 的幾種查找圖像中輪廓邊緣的方法

?原始圖片:

?

1、Sobel()

Sobel 算子結合了高斯平滑和微分,用于計算圖像的梯度,從而突出顯示邊緣。

import cv2# 讀取圖像
image = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 使用 Sobel 算子查找水平和垂直邊緣
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)# 疊加水平和垂直邊緣
edges = cv2.addWeighted(cv2.convertScaleAbs(sobel_x), 0.5, cv2.convertScaleAbs(sobel_y), 0.5, 0)# 顯示結果
cv2.imshow("Original Image", image)
cv2.imshow("Edges", edges)cv2.waitKey(0)
cv2.destroyAllWindows()

函數原型:

sobel = cv2.Sobel(src, ddepth, dx, dy, ksize, scale, delta, borderType)?

參數說明:

  1. src: 輸入圖像(單通道,例如灰度圖)。
  2. ddepth: 輸出圖像的深度(例如?cv2.CV_64F?表示 64 位浮點數)。
  3. dx: x 方向上的導數階數(0表示沒有導數,1表示一階導數)。
  4. dy: y 方向上的導數階數(與 dx 類似)。
  5. ksize: Sobel 核的大小,必須是 1, 3, 5 或 7 等奇數。
  6. scale: 可選值,縮放導數結果,以便調整圖像亮度(默認值為 1)。
  7. delta: 可選值,在存儲之前添加到結果中的值(默認值為 0)。
  8. borderType: 邊界類型,用于確定圖像邊界(默認值為?cv2.BORDER_DEFAULT)。

?2、Scharr()

Scharr 算子是一種改進的 Sobel 算子,適用于增強邊緣檢測的精度,在正常的 Sobel 核的尺寸上有更好的性能。

scharr_x = cv2.Scharr(src, ddepth, dx, dy, scale, delta, borderType)

參數說明:

  • 與?cv2.Sobel()?相同,只是?ksize?參數被硬編碼為 3。

import cv2
import numpy as np# 讀取圖像并轉換為灰度圖
image = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 使用 Scharr 算子計算 x 和 y 方向上的梯度
grad_x = cv2.Scharr(image, cv2.CV_64F, 1, 0)
grad_y = cv2.Scharr(image, cv2.CV_64F, 0, 1)# 將梯度取絕對值并轉換為 8 位圖像
abs_grad_x = cv2.convertScaleAbs(grad_x)
abs_grad_y = cv2.convertScaleAbs(grad_y)# 合并 x 方向和 y 方向的梯度
scharr = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)# 顯示圖像
cv2.imshow('Scharr Edge Detection', scharr)
cv2.waitKey(0)
cv2.destroyAllWindows()

?

3、Canny()

Canny 邊緣檢測是一種多級邊緣檢測算法,效果較為顯著,常用來檢測圖像中的明顯邊緣。

?函數原型:

edges = cv2.Canny(image, threshold1, threshold2, apertureSize, L2gradient)

參數說明:

  • image: 輸入圖像,通常是灰度圖。
  • threshold1: 較低的閾值,用于邊緣檢測的滯后閾值過程。
  • threshold2: 較高的閾值。
  • apertureSize: Sobel 算子的大小,默認值為 3。
  • L2gradient: 可選參數,用于計算圖像梯度幅值的標志。如果為 True,則使用更精確的 L2 范數計算梯度,否則使用 L1 范數。
  • import cv2# 讀取圖像并轉換為灰度圖
    image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 使用 Canny 邊緣檢測
    edges = cv2.Canny(image, 100, 200)# 顯示圖像
    cv2.imshow('Canny Edge Detection', edges)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

4、Laplacian?()

Laplacian 算子是一種二階導數算子,用于檢測圖像中的邊緣。

laplacian = cv2.Laplacian(src, ddepth, ksize, scale, delta, borderType)

參數說明:

  • src: 輸入圖像。
  • ddepth: 輸出圖像的深度。
  • ksize: Laplacian 算子的大小,必須是正奇數。
  • scale: 可選參數,用于縮放導數值,默認值為 1。
  • delta: 可選參數,在存儲之前添加到結果中的值,默認值為 0。
  • borderType: 邊界模式,默認值為?cv2.BORDER_DEFAULT
    import cv2
    import numpy as np# 讀取圖像并轉換為灰度圖
    image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 使用 Laplacian 邊緣檢測
    laplacian = cv2.Laplacian(image, cv2.CV_64F)# 將結果轉換為 8 位圖像
    laplacian = cv2.convertScaleAbs(laplacian)# 顯示圖像
    cv2.imshow('Laplacian Edge Detection', laplacian)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

5、Prewitt算子

Prewitt 算子是另一種一階導數算子,可以檢測水平和垂直邊緣。雖然 OpenCV 沒有直接提供?cv2.prewitt()?函數,但可以使用?cv2.filter2D?函數自定義 Prewitt 核來實現。?

import cv2
import numpy as np# 讀取圖像并轉換為灰度圖
image = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 定義 Prewitt 核
prewitt_kernel_x = np.array([[1, 0, -1],[1, 0, -1],[1, 0, -1]])
prewitt_kernel_y = np.array([[1, 1, 1],[0, 0, 0],[-1, -1, -1]])# 使用 Prewitt 核進行邊緣檢測
grad_x = cv2.filter2D(image, cv2.CV_64F, prewitt_kernel_x)
grad_y = cv2.filter2D(image, cv2.CV_64F, prewitt_kernel_y)# 計算梯度幅值
abs_grad_x = cv2.convertScaleAbs(grad_x)
abs_grad_y = cv2.convertScaleAbs(grad_y)
prewitt = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)# 顯示圖像
cv2.imshow('Prewitt Edge Detection', prewitt)
cv2.waitKey(0)
cv2.destroyAllWindows()

??

?6、Roberts Cross算子

羅伯特交叉算子是一種簡單且快速的邊緣檢測算子,適用于檢測圖像的對角邊緣。OpenCV 中沒有直接提供羅伯特交叉算子,但可以通過自定義卷積核實現。

import cv2
import numpy as np# 讀取圖像并轉換為灰度圖
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 定義 Roberts 核
roberts_kernel_x = np.array([[1, 0],[0, -1]])
roberts_kernel_y = np.array([[0, 1],[-1, 0]])# 使用 Roberts 核進行邊緣檢測
grad_x = cv2.filter2D(image, cv2.CV_64F, roberts_kernel_x)
grad_y = cv2.filter2D(image, cv2.CV_64F, roberts_kernel_y)# 計算梯度幅值
abs_grad_x = cv2.convertScaleAbs(grad_x)
abs_grad_y = cv2.convertScaleAbs(grad_y)
roberts = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)# 顯示圖像
cv2.imshow('Roberts Edge Detection', roberts)
cv2.waitKey(0)
cv2.destroyAllWindows()

7、自定義卷積核

還可以通過自定義卷積核來進行邊緣檢測。

import cv2
import numpy as np# 讀取圖像并轉換為灰度圖
image = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 定義自定義卷積核
custom_kernel = np.array([[-1, -1, -1],[-1, 7, -1],[-1, -1, -1]])# 使用自定義卷積核進行邊緣檢測
custom_edges = cv2.filter2D(image, cv2.CV_64F, custom_kernel)# 將結果轉換為 8 位圖像
custom_edges = cv2.convertScaleAbs(custom_edges)# 顯示圖像
cv2.imshow('Custom Kernel Edge Detection', custom_edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

?8、基于直方圖的邊緣檢測

基于直方圖的方法,通過分析圖像的灰度直方圖來檢測邊緣。

import cv2
import numpy as np# 讀取圖像并轉換為灰度圖
image = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 計算圖像的直方圖
hist = cv2.calcHist([image], [0], None, [256], [0, 256])# 找到直方圖的峰值
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(hist)# 使用峰值作為閾值進行二值化處理
_, binary = cv2.threshold(image, max_loc[1] - 30, 255, cv2.THRESH_BINARY)# 顯示圖像
cv2.imshow('Histogram Based Edge Detection', binary)
cv2.waitKey(0)
cv2.destroyAllWindows()

?

9、adaptiveThreshold()

自適應閾值

自適應閾值可以在照明不均勻的情況下檢測邊緣。

函數原型:

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst])

參數說明:

  • src:輸入圖像,應為灰度圖像(單通道)。
  • maxValue:指定在滿足條件時給輸出像素賦予的最大值(通常為255)。
  • adaptiveMethod:自適應方法。可選值有:
    • cv2.ADAPTIVE_THRESH_MEAN_C:基于鄰域均值的自適應閾值化方法。
    • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:基于鄰域加權均值的自適應閾值化方法。
  • thresholdType:閾值類型,應為?cv2.THRESH_BINARY?或?cv2.THRESH_BINARY_INV
  • blockSize:指定用于計算閾值的鄰域大小,一般為奇數。
  • C:從計算的平均值或加權平均值中減去的常數。

import cv2# 讀取圖像并轉換為灰度圖
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 自適應閾值
adaptive_threshold = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)# 顯示圖像
cv2.imshow('Adaptive Threshold Edge Detection', adaptive_threshold)
cv2.waitKey(0)
cv2.destroyAllWindows()

?

10、threshold()

閾值化 (cv2.threshold)

簡單的全局閾值化方法,通過固定的閾值來二值化圖像以檢測邊緣。

import cv2# 讀取圖像并轉換為灰度圖
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 全局閾值化
_, threshold = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)# 顯示圖像
cv2.imshow('Global Threshold Edge Detection', threshold)
cv2.waitKey(0)
cv2.destroyAllWindows()

?

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

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

相關文章

建筑企業有閑置資質怎么辦?

如果建筑企業擁有閑置資質,可以考慮以下幾種方式來充分利用這些資質: 1. 租賃或轉讓資質: 將閑置的建筑資質租賃給其他企業或個人使用,或者通過轉讓的方式將資質出售給有需要的企業或個人。 2. 提供咨詢服務: 利用建…

git分布式版本控制系統(四)

目前世界上最先進的分布式版本控制系統 官方網址:https://git-scm.com 學習目標: 1 了解 git 前世今生 2 掌握 git 基礎概念、基礎操作 3 各種 git 問題處理 4 互聯網常用 gitflow(工作流程規范) 5 git 代碼提交規范 6 git 分支管理及命名規范 常見問…

OneForall工具的下載安裝和使用(Windows和Linux)

目錄 OneForall的介紹 OneForall的下載 OneForall的安裝 安裝要求 安裝步驟(git 版) 安裝(kali) OneForall的使用命令 在Windows 在Linux(kali) OneForall的結果說明 免責聲明 本文所提供的文字和…

車輛前向碰撞預警系統性能要求和測試規程

前言 本文整理《GB/T 33577-2017 智能運輸系統-車輛前向碰撞預警系統性能要求和測試規程》國標文件關鍵信息,FCW系統性能和測試右給深層次的認識。 術語和定義 車輛前向碰撞預警系統 forward vehicle collision warning system自車 subject vehicle(SV)目標車輛 target ve…

【Linux】查找和壓縮

一、文件查找 1、命令查找 which 2、文件查找、依賴數據庫 locate 3、文件查找 find 語法:find [path] [options] [expression] [action] ①按文件名 -name按名 -iname可不區分大小寫 ②按文件大小 5M:5M以上文件 5M:5M文件 -…

高中數學:解三角形相關公式總結及用法總結

一、正弦定理 二、余弦定理 三、三角形面積公式 由正弦定理,可以推出三角形的面積公式: S*ab*sinC S*ac*sinB S*bc*sinA 四、使用方法總結 五、練習 例題1 解析 對條件等式進行變形,結合余弦定理,求出∠A的度數,從而…

【面經分享-CPP篇】[建議收藏!!] C++基礎20問-01

🍭 大家好這里是清隆學長 ,一枚熱愛算法的程序員 ? 本系列打算持續跟新c面試基礎 👏 感謝大家的訂閱? 和 喜歡💗 文章目錄 1.題目:解釋C中的RAII機制。2.題目:解釋C中的智能指針及其類型。3.題目&#xf…

從內存到sql的upsert

業務的upsert ? 在寫業務時,大家一開始都會以順序流程的方式開始著手寫代碼,CR時再看代碼,會有不一樣的感覺。 1. 需求描述 ? 現有一張數據庫表,表字段結構如下: 字段名稱類型描述uuidstring數據的唯一鍵datastrin…

代碼隨想錄算法訓練營第四十六天|KM52. 攜帶研究材料、518. 零錢兌換 II、377. 組合總和 Ⅳ

代碼隨想錄算法訓練營第四十六天 KM52. 攜帶研究材料 題目鏈接:KM52. 攜帶研究材料 確定dp數組以及下標的含義:j的含義是當前背包的最大容量,dp[j]背包內物品的總價值確定遞推公式:背包最大容量固定為j,每個循環嘗試…

Nginx01-HTTP簡介與Nginx簡介(安裝、命令介紹、目錄介紹、配置文件介紹)

目錄 HTTP簡介HTTP原理查看訪問網站的詳細流程curl -vwget --debug 查看網站訪問量HTTP協議版本HTTP協議交互HTTP 請求請求報文起始行請求頭 HTTP響應響應報文起始行響應頭 Nginx常見的Web服務常見網站服務 安裝NginxNginx目錄結構Nginx啟動管理Nginx常用命令 Nginx配置文件主配…

國內外主流大模型語言技術大比拼

國內外主流大模型語言技術對比 2024 自2017年起,美國深度布局人工智能,全面融入經濟、文化與社會。至2023年,中國憑借自研技術平臺嶄露頭角,ChatGPT及其技術成國家戰略焦點,引領未來科技浪潮。中美競逐,人工…

Milvus向量數據庫:開啟向量搜索新紀元

Milvus向量數據庫:開啟向量搜索新紀元 隨著人工智能和機器學習技術的飛速發展,向量數據在各個領域的應用越來越廣泛,如推薦系統、自然語言處理、計算機視覺等。在這樣的背景下,如何高效地存儲、查詢和管理向量數據成為了一個重要的…

香橙派 AI pro:AI 加速初體驗

香橙派 AI pro:AI 加速初體驗 在AI領域,不斷涌現的硬件產品為開發者提供了前所未有的便利和可能性。今天,我要介紹的這款產品——香橙派 AIpro,就是其中的佼佼者。在昇騰 AI 芯片的加持下,這款開發板有著出色的算力。…

961題庫 北航計算機 操作系統 附答案 選擇題形式

有題目和答案,沒有解析,不懂的題問大模型即可,無償分享。 第1組 習題 計算機系統的組成包括( ) A、程序和數據 B、處理器和內存 C、計算機硬件和計算機軟件 D、處理器、存儲器和外圍設備 財務軟件是一種&#xff…

【Qt 學習筆記】Qt窗口 | 對話框 | Qt對話框的分類及介紹

博客主頁:Duck Bro 博客主頁系列專欄:Qt 專欄關注博主,后期持續更新系列文章如果有錯誤感謝請大家批評指出,及時修改感謝大家點贊👍收藏?評論? Qt窗口 | 對話框 | 模態對話框 文章編號:Qt 學習筆記 / 51…

Java反序列化漏洞與URLDNS利用鏈分析

前言 前面學習過 Java 反序列化漏洞的部分知識,總結過幾篇文章: 文章發布日期內容概括《滲透測試-JBoss 5.x/6.x反序列化漏洞》2020-07-08JBoss 反序列化漏洞 CVE-2017-12149 的簡單復現,使用了 ysoserial 和 CC5 鏈,未分析漏洞…

easy-captcha生成驗證碼

引入依賴 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>…

[力扣題解] 404. 左葉子之和

題目&#xff1a;404. 左葉子之和 思路 前序遍歷&#xff08;隨便怎么遍歷&#xff09;&#xff1b; 在遇到左葉子時處理數據&#xff0c;選擇中、左、右里面的左的時候再判斷這個節點是不是葉子&#xff1b; 代碼 /*** Definition for a binary tree node.* struct TreeNo…

Unity2D游戲開發-玩家控制

在Unity2D游戲開發中&#xff0c;玩家控制是游戲互動性的核心。本文將解析一個典型的Unity2D玩家控制腳本&#xff0c;探討如何實現流暢的玩家移動、跳躍和動畫切換。以下是一個Unity腳本示例&#xff0c;實現了這些基礎功能。 1. 腳本結構 using System.Collections; using …

機械設計手冊第一冊:公差

形位公差的標注&#xff1a; 形位公差框格中&#xff0c;不僅要表達形位公差的特征項目、基準代號和其他符號&#xff0c;還要正確給出公差帶的大小、形狀等內容。 1.形位公差框格&#xff1a; 形位公差框格由兩個框格或多個格框組成&#xff0c;框格中的主要內容從左到右按…