[OpenCV基礎][Python]connectedComponent連通域分析

2024/04/24閱讀時間約 4 分鐘


本篇文章主要講述cv2.connectedComponent應用於物件上的分割,將不同文字分割並用不同顏色標記。



範例程式結果圖

標示連通域結果

標示連通域結果


函式介紹

cv2.connectedComponentsWithStats

是 OpenCV 中用來執行連通元件標記的函式之一。

它的作用是將二值化的影像中的連通元件找出來,並給每個連通元件分配一個標籤,同時提供每個連通元件的統計信息,例如面積、中心點等。

函式的語法如下:

num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(binaryImg, connectivity=8)


其中各參數的意義如下:

  • binaryImg:二值化的影像,黑白兩色分別表示目標物體和背景
  • connectivity:連通性,設置為 8 表示在水平、垂直和對角線方向均為連通。


函式的返回值包括:

  • num_labels:連通元件的數量(第一個標籤是代表背景的)。
  • labels:與輸入影像同大小的陣列,每個像素點的標籤值對應該像素所屬的連通元件
    ※注意標記的順序,是由左至右,由上至下的順序編號,若有物件在同一排略高就會先被優先標記。
  • stats:一個陣列,包含每個連通元件的統計信息,例如面積、外接矩形的大小等。
  • centroids:一個陣列,包含每個連通元件的中心點坐標。

這個函式在圖像分割物體檢測等領域中很常用,可以幫助我們識別圖像中的不同物體或區域

連通域標記示意圖

連通域標記示意圖


程式範例

import cv2
import numpy as np

# 讀取圖像
image = cv2.imread('輸入圖片路徑')

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化處理
_, binaryImg = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

# 連通域分析
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(binaryImg, connectivity=8)

# 設定不同顏色的標記
colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 0, 255)]

# 繪製不同顏色的標記
for i in range(1, num_labels):
color = colors[i % len(colors)] # 循環選擇顏色
# 標記為指定的顏色
mask = labels == i
image[mask] = color

# 顯示結果
cv2.imshow('Connected Components', image)
cv2.waitKey(0)
cv2.destroyAllWindows()


標記為指定的顏色方法是為先創建一個mask的遮罩,然後在將遮罩內的值指定為想要的色

# 標記為指定的顏色
mask = labels == i
image[mask] = color
  1. mask = labels == i:這裡,我們創建了一個布林遮罩(boolean mask),這個遮罩的形狀與原始圖像相同。遮罩中的每個元素都是布林值(True或False),根據連通域分析的結果,如果某個像素屬於指定的連通區域(或物體),則對應位置為True,否則為False。labels == i的作用是找到與特定標籤(i)對應的像素。
  2. image[mask] = color:這一行程式碼的目的是將屬於特定連通區域的像素在原始圖像上標記為指定的顏色。通過布林遮罩mask,我們選擇了屬於特定連通區域的像素位置,然後將這些像素的值(即圖像中對應位置的像素)設置為指定的顏色color


49會員
88內容數
Python程式設計師,不是在學習就是在學習的路上
留言0
查看全部
發表第一個留言支持創作者!