最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于OpenCV的圖像邊緣檢測與輪廓分析

 更新時間:2026年01月19日 08:23:01   作者:子夜江寒  
本文介紹了圖像處理中的邊緣檢測和輪廓分析方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、邊緣檢測方法

1. Sobel算子邊緣檢測

Sobel算子通過計算圖像灰度函數(shù)的梯度來檢測邊緣,分別計算水平和垂直方向的梯度,然后合并得到完整邊緣圖像。

import cv2

pic = cv2.imread(r"picture_1.jpg", 0)
pic_x_64 = cv2.Sobel(pic, cv2.CV_64F, dx=1, dy=0)
pic_x_full = cv2.convertScaleAbs(pic_x_64)
pic_y_64 = cv2.Sobel(pic, cv2.CV_64F, dx=0, dy=1)
pic_y_full = cv2.convertScaleAbs(pic_y_64)
pic_xy_sobel_full = cv2.addWeighted(pic_x_full, 1, pic_y_full, 1, 0)

參數(shù)分析:

  • cv2.CV_64F:輸出圖像的深度,64位浮點數(shù)類型
  • dx=1, dy=0:計算x方向(水平)梯度
  • dx=0, dy=1:計算y方向(垂直)梯度
  • cv2.convertScaleAbs():將負(fù)梯度值轉(zhuǎn)換為絕對值并縮放

2. Scharr算子邊緣檢測

Scharr算子是Sobel算子的改進版本,對邊緣的響應(yīng)更敏感,能檢測到更細(xì)微的邊緣變化。

pic = cv2.imread(r"picture_1.jpg", cv2.IMREAD_GRAYSCALE)
pic_x_64 = cv2.Scharr(pic, cv2.CV_64F, dx=1, dy=0)
pic_x_full = cv2.convertScaleAbs(pic_x_64)
pic_y_64 = cv2.Scharr(pic, cv2.CV_64F, dx=0, dy=1)
pic_y_full = cv2.convertScaleAbs(pic_y_64)
pic_xy_scharr_full = cv2.addWeighted(pic_x_full, 1, pic_y_full, 1, 0)

3. Laplacian邊緣檢測

Laplacian算子基于二階導(dǎo)數(shù),能同時檢測圖像的兩個方向的邊緣,對噪聲更敏感但能檢測到更精細(xì)的邊緣。

pic = cv2.imread(r"picture_1.jpg", cv2.IMREAD_GRAYSCALE)
pic_lap = cv2.Laplacian(pic, cv2.CV_64F, ksize=3)
pic_lap_full = cv2.convertScaleAbs(pic_lap)

參數(shù)分析:

  • ksize=3:拉普拉斯核的大小,必須為正奇數(shù)

4. Canny邊緣檢測

Canny邊緣檢測是多階段算法,包括高斯濾波、梯度計算、非極大值抑制和雙閾值檢測,是效果最好的邊緣檢測算法之一。

pic = cv2.imread(r"picture_1.jpg", cv2.IMREAD_GRAYSCALE)
pic_canny = cv2.Canny(pic, 100, 150)

參數(shù)分析:

  • 100:低閾值,低于此值的邊緣被丟棄
  • 150:高閾值,高于此值的邊緣被保留為強邊緣

二、圖像輪廓分析

1. 輪廓提取基礎(chǔ)

輪廓提取需要先將圖像轉(zhuǎn)換為二值圖像,然后使用findContours函數(shù)查找輪廓。

# 灰度圖處理
phone = cv2.imread(r"picture_1.jpg")
phone = cv2.resize(phone, dsize=None, fx=0.4, fy=0.4)
phone_gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY)

# 閾值處理為二值圖像
ret, phone_binary = cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY)

# 查找輪廓
_, contours, hierarchy = cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

print(len(contours))

參數(shù)分析:

  • cv2.THRESH_BINARY:閾值化類型,大于閾值設(shè)為255,小于設(shè)為0
  • cv2.RETR_TREE:輪廓檢索模式,檢索所有輪廓并重建完整的層次結(jié)構(gòu)
  • cv2.CHAIN_APPROX_NONE:輪廓近似方法,存儲所有輪廓點

2. 輪廓繪制方法

image_copy = phone.copy()
cv2.drawContours(image=image_copy, contours=contours, contourIdx=-1, color=(0, 255, 0), thickness=2)

# 逐個繪制輪廓的替代方法
for i in range(len(contours)):
    image_copy = cv2.drawContours(image=image_copy, contours=contours, contourIdx=i, color=(0, 255, 0), thickness=3)
    cv2.imshow('Contours_show', image_copy)
    cv2.waitKey(0)

參數(shù)分析:

contourIdx=-1:繪制所有輪廓,指定索引則繪制單個輪廓

3. 輪廓特征計算

# 輪廓面積計算
area_0 = cv2.contourArea(contours[0])
area_1 = cv2.contourArea(contours[1])

# 輪廓周長計算
length = cv2.arcLength(contours[0], closed=True)

# 根據(jù)面積篩選輪廓
a_list = []
for i in contours:
    if cv2.contourArea(i) > 10000:
        a_list.append(i)

4. 輪廓定位與排序

# 根據(jù)面積排序獲取最大輪廓
sortcnt = sorted(contours, key=cv2.contourArea, reverse=True)[0]
image_contours = cv2.drawContours(image_copy, [sortcnt], contourIdx=-1, color=(0, 0, 255), thickness=3)

5. 輪廓幾何特征

cnt = contours[8]

# 最小外接圓
(x, y), r = cv2.minEnclosingCircle(cnt)
phone_circle = cv2.circle(phone, center=(int(x), int(y)), radius=int(r), color=(0, 255, 0), thickness=2)

# 最小外接矩形
x, y, w, h = cv2.boundingRect(cnt)
phone_rectangle = cv2.rectangle(phone, pt1=(x, y), pt2=(x + w, y + h), color=(0, 255, 0), thickness=2)

三、輪廓近似與簡化

輪廓近似可以減少輪廓點的數(shù)量,同時保持輪廓的基本形狀,常用于減少計算復(fù)雜度和數(shù)據(jù)存儲。

phone = cv2.imread('phone.png')
phone_gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY)
ret, phone_thresh = cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY)

# 兼容不同OpenCV版本的輪廓查找
contours = cv2.findContours(phone_thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[-2]

# 輪廓近似
epsilon = 0.01 * cv2.arcLength(contours[0], closed=True)
approx = cv2.approxPolyDP(contours[0], epsilon, closed=True)

print(contours[0].shape)  # 原始輪廓點數(shù)
print(approx.shape)       # 近似后輪廓點數(shù)

# 繪制近似輪廓
phone_new = phone.copy()
image_contours = cv2.drawContours(phone_new, [approx], contourIdx=-1, color=(0, 255, 0), thickness=3)

參數(shù)分析:

  • epsilon:近似精度參數(shù),通常取輪廓周長的百分比
  • closed=True:指示輪廓是封閉的

到此這篇關(guān)于基于OpenCV的圖像邊緣檢測與輪廓分析的文章就介紹到這了,更多相關(guān)OpenCV 圖像邊緣檢測與輪廓內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實現(xiàn)Excel條件格式自動化設(shè)置

    Python實現(xiàn)Excel條件格式自動化設(shè)置

    在處理大量 Excel 數(shù)據(jù)時,條件格式無疑是提升數(shù)據(jù)可讀性和洞察力的強大工具,本文將深入探討如何利用 Python 及其 Spire.XLS for Python 庫,實現(xiàn) Excel 條件格式的自動化設(shè)置,感興趣的小伙伴可以了解下
    2026-01-01
  • python如何打印楊輝三角及輸出第m行第k個數(shù)

    python如何打印楊輝三角及輸出第m行第k個數(shù)

    這篇文章主要介紹了python如何打印楊輝三角及輸出第m行第k個數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 詳解Python發(fā)送email的三種方式

    詳解Python發(fā)送email的三種方式

    這篇文章主要介紹了詳解Python發(fā)送email的三種方式,Python發(fā)送email的三種方式,分別為使用登錄郵件服務(wù)器、使用smtp服務(wù)、調(diào)用sendmail命令來發(fā)送三種方法,非常具有實用價值,需要的朋友可以參考下
    2018-10-10
  • Python編解碼問題及文本文件處理方法詳解

    Python編解碼問題及文本文件處理方法詳解

    最近在做一個項目,因為文本處理的內(nèi)容是中文,所以不得不面對python中文處理所帶來的種種困惑,這篇文章主要給大家介紹了關(guān)于Python編解碼問題及文本文件處理方法的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • Python中SyntaxError: invalid syntax報錯解決

    Python中SyntaxError: invalid syntax報錯解決

    在編寫Python代碼時,常見的SyntaxError錯誤通常由括號不匹配、關(guān)鍵字拼寫錯誤或不正確的縮進引起,本文詳細(xì)介紹了錯誤原因及多種解決方案,包括檢查括號、關(guān)鍵字,以及使用IDE的語法檢查功能等,感興趣的可以了解一下
    2024-09-09
  • OpenCV實現(xiàn)圖像濾波之雙邊濾波

    OpenCV實現(xiàn)圖像濾波之雙邊濾波

    這篇文章主要為大家詳細(xì)介紹了OpenCV實現(xiàn)圖像濾波之雙邊濾波,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Django顯示可視化圖表的實踐

    Django顯示可視化圖表的實踐

    這篇文章主要介紹了Django顯示可視化圖表的實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • python按行讀取文件并找出其中指定字符串

    python按行讀取文件并找出其中指定字符串

    這篇文章主要介紹了python按行讀取文件并找出其中指定字符串的方法,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • Python桌面應(yīng)用開發(fā)實戰(zhàn)之PyQt的安裝使用

    Python桌面應(yīng)用開發(fā)實戰(zhàn)之PyQt的安裝使用

    這篇文章主要給大家介紹了關(guān)于Python桌面應(yīng)用開發(fā)實戰(zhàn)之PyQt的安裝使用,PyQt是一個功能強大的Python庫,用于創(chuàng)建圖形用戶界面(GUI)應(yīng)用程序,需要的朋友可以參考下
    2023-08-08
  • python實現(xiàn)智能語音天氣預(yù)報

    python實現(xiàn)智能語音天氣預(yù)報

    今天小編就為大家分享一篇python實現(xiàn)智能語音天氣預(yù)報,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12

最新評論

拉孜县| 齐河县| 娄烦县| 余姚市| 钦州市| 南溪县| 塔城市| 泸西县| 临漳县| 扎囊县| 黔东| 白沙| 鲁山县| 大悟县| 泊头市| 巩义市| 丹巴县| 宜城市| 绵竹市| 西华县| 大埔县| 疏勒县| 保山市| 肇庆市| 卢湾区| 隆化县| 宜良县| 黔西县| 苏尼特左旗| 治多县| 高台县| 莱芜市| 孝义市| 湖南省| 新邵县| 三河市| 从化市| 双江| 抚远县| 苍梧县| 保山市|