提取圖片中目標物輪廓的畫素尺寸

塞外声發表於2024-11-20

1.匯入資料庫

import cv2
import numpy as np
from PIL import Image

2.匯入圖片

image_tif = Image.open('1.tif')  #匯入tif影像
image_tif.convert('RGB').save('1p.png','PNG') # 轉換為png格式
image = cv2.imread('1p.png') #讀取png影像

3.轉化為灰度圖

# 將圖片轉換為灰度圖
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 應用高斯模糊,減少噪聲
blur = cv2.GaussianBlur(gray, (5, 5), 0)

4.二值化處理

# 二值化處理
ret, thresh = cv2.threshold(blur, 180, 255, cv2.THRESH_BINARY)

5.尋找目標物輪廓

# 尋找輪廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #檢測所有輪廓,建立樹狀結構關係;儲存水平、垂直或對角線的端點
#contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) #檢測所有輪廓,但不建立層次關係;儲存輪廓上所有的點

# 遍歷輪廓
for cnt in contours:
    # 計算輪廓的邊界框
    x, y, w, h = cv2.boundingRect(cnt)
    
    # 計算輪廓的面積
    area = cv2.contourArea(cnt)
    
    # 根據需要的條件過濾輪廓(例如,面積大小)
    if area > 10000 and area < 20000:  # 根據面積篩選目標物
        # 繪製輪廓的邊界框
        cv2.rectangle(thresh, (x, y), (x+w, y+h), (0, 0, 255), 2)
        
        # 列印尺寸
        print(f"Object width: {w}, Object height: {h}")

# 顯示圖片
cv2.imshow('Detected Objects', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

6.結果展示

image

結果展示: Object width: 111, Object height: 140

完整程式碼
import cv2
import numpy as np
from PIL import Image


# 讀取圖片
#image = cv2.imread('1.tif')

image_tif = Image.open('1.tif')  #匯入tif影像
image_tif.convert('RGB').save('1p.png','PNG') # 轉換為png格式
image = cv2.imread('1p.png') #讀取png影像

# 將圖片轉換為灰度圖
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 應用高斯模糊,減少噪聲
blur = cv2.GaussianBlur(gray, (5, 5), 0)


# 二值化處理
ret, thresh = cv2.threshold(blur, 180, 255, cv2.THRESH_BINARY)

# 尋找輪廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #檢測所有輪廓,建立樹狀結構關係;儲存水平、垂直或對角線的端點
#contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) #檢測所有輪廓,但不建立層次關係;儲存輪廓上所有的點

# 遍歷輪廓
for cnt in contours:
    # 計算輪廓的邊界框
    x, y, w, h = cv2.boundingRect(cnt)
    
    # 計算輪廓的面積
    area = cv2.contourArea(cnt)
    
    # 根據需要的條件過濾輪廓(例如,面積大小)
    if area > 10000 and area < 20000:  # 根據面積篩選目標物
        # 繪製輪廓的邊界框
        cv2.rectangle(thresh, (x, y), (x+w, y+h), (0, 0, 255), 2)
        
        # 列印尺寸
        print(f"Object width: {w}, Object height: {h}")

# 顯示圖片

cv2.imshow('Detected Objects', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

相關文章