Opencv輪廓提取

一、輪廓提取的概念

圖像輪廓是連接具有相同顏色和強度的所有連續點(邊緣)的曲線。通過輪廓提取,可以找到圖像中的物體邊緣或者邊緣之間的空隙,從而進行圖像分割等一些列操作。

二、輪廓提取基本流程

在Opencv中,輪廓提取的基本流程包括以下幾個步驟:

  1. 讀入原始圖像並進行灰度化處理。
  2. 對灰度圖像進行二值化處理。
  3. 進行輪廓發現,得到輪廓點集。
  4. 繪製輪廓線。

下面是一個完整的示例代碼:

import cv2

img = cv2.imread('example.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
cv2.imshow('contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、輪廓的性質

輪廓除了可以用於圖像分割,還可以提供很多其他有用的信息,比如:輪廓面積、周長、質心、邊界框、最小矩形等。

以下是示例代碼:

import cv2

img = cv2.imread('example.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for i in range(len(contours)):
    area = cv2.contourArea(contours[i])
    arclen = cv2.arcLength(contours[i], True)
    moments = cv2.moments(contours[i])
    cx = int(moments['m10']/moments['m00'])
    cy = int(moments['m01']/moments['m00'])
    rect = cv2.boundingRect(contours[i])
    minRect = cv2.minAreaRect(contours[i])
    box = cv2.boxPoints(minRect)
    box = np.int0(box)

    cv2.drawContours(img, [box], 0, (0, 255, 0), 2)
    cv2.circle(img, (cx, cy), 2, (0, 0, 255), -1)
    cv2.rectangle(img, (rect[0], rect[1]), (rect[0]+rect[2], rect[1]+rect[3]), (255, 0, 0), 2)
    cv2.putText(img, str(i), (cx, cy), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)

cv2.imshow('contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、輪廓的近似

在實際應用中,為了降低輪廓點數,可以對輪廓進行近似處理,得到更加簡化的輪廓曲線。常用的方法有:Douglas-Peucker算法和Ramirez-Schafer算法。

openCV提供了approxPolyDP函數進行輪廓近似,函數基本語法如下:

epsilon = cv2.approxPolyDP(curve, epsilon, closed)

其中,curve表示輸入輪廓,epsilon為近似精度,closed為一個布爾值,表示曲線是否閉合。

以下是示例代碼:

import cv2

img = cv2.imread('example.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for i in range(len(contours)):
    epsilon = 0.01 * cv2.arcLength(contours[i], True)
    approx = cv2.approxPolyDP(contours[i], epsilon, True)
    cv2.drawContours(img, [approx], 0, (0, 0, 255), 2)

cv2.imshow('contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

五、總結

通過本文的介紹,我們可以看到輪廓提取在圖像處理中的重要性。在實際應用中,我們可以根據輪廓的性質對物體進行檢測、分割、識別等操作。同時,輪廓的近似處理也可以大大減少輪廓點數,提高圖像處理效率。

原創文章,作者:FLMEG,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/324604.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FLMEG的頭像FLMEG
上一篇 2025-01-13 13:23
下一篇 2025-01-13 13:23

相關推薦

  • 如何在PyCharm中安裝OpenCV?

    本文將從以下幾個方面詳細介紹如何在PyCharm中安裝OpenCV。 一、安裝Python 在安裝OpenCV之前,請確保已經安裝了Python。 如果您還沒有安裝Python,可…

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

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

    編程 2025-04-29
  • Opencv 實現讀取 BMP 圖片

    Opencv 是一個基於 C/C++ 語言的開源計算機視覺庫,可以用於圖像處理、特徵識別、目標跟蹤、機器學習等領域。在圖像處理中,讀取 BMP 圖片是常見操作之一。 一、打開 BM…

    編程 2025-04-27
  • opencv鼠標繪圖

    本文將為您詳細介紹如何使用opencv在原始圖片上進行鼠標繪圖。 一、準備工作 在開始繪製之前,您需要先準備好以下的工作: 1、安裝opencv庫,可以通過pip install …

    編程 2025-04-27
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • OpenCV的全面介紹

    OpenCV是一款強大的開源計算機視覺庫,它包含了各種用於圖像和視頻處理,圖像識別和機器學習的函數,它可以用於開發實時的計算機視覺軟件和系統,特別適用於圖像處理、物體識別、人臉識別…

    編程 2025-04-25
  • Opencv CUDA編譯用法介紹

    本文將從多個方面對Opencv CUDA編譯進行詳細的闡述和解讀。通過以下小標題,我們將詳細介紹如何進行編譯。 一、環境搭建 在使用CUDA進行加速之前,需要進行CUDA的環境搭建…

    編程 2025-04-25
  • 詳解OpenCV高斯濾波

    一、高斯濾波的介紹 OpenCV高斯濾波是一種平滑圖像的處理方法,通常用於去除噪聲、模糊化圖像等。它的原理是利用高斯函數進行加權平均,從而減少噪聲的干擾。 在圖像處理中,噪聲是一種…

    編程 2025-04-25
  • Clion配置OpenCV

    Clion是一個功能強大的跨平台集成開發環境,但要開發圖像處理、計算機視覺等相關領域應用,需要將OpenCV集成到Clion中,才能方便地進行開發。本文將介紹如何在Clion中配置…

    編程 2025-04-24
  • OpenCV之cv2.imshow()

    一、cv2.imshow()介紹 cv2.imshow()是OpenCV中顯示圖像的主要函數之一。它可以顯示傳遞給它的圖像窗口,或者將圖像作為選定窗口的內容。cv2.imshow(…

    編程 2025-04-24

發表回復

登錄後才能評論