更新於 2024/03/15閱讀時間約 4 分鐘

[OpenCV應用][Python]利用numpy找出物件邊緣求出寬度及高度

大部分在求物件的寬度及高度,都會想到用OpenCV的findContours函式來做,從找到的輪廓中來計算物件的面積,周長,邊界框等屬性,從而得到物體的寬度與高度

[OpenCV應用][Python]利用findContours找出物件邊界框求出寬度及高度

本文將用不同的方法,利用Numpy一樣求出物件的寬度及高度

本文實驗結果圖

結果圖


程式範例

import cv2
import numpy as np

# 讀取圖像
image = cv2.imread('image.png')

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

# 進行閾值處理或其他圖像預處理操作,以便得到二值圖像
_, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

edge_coordinates = np.column_stack(np.where(threshold > 0))
#取得四個邊的位子
leftmost = np.min(edge_coordinates[:, 1])
topmost = np.min(edge_coordinates[:, 0])
rightmost = np.max(edge_coordinates[:, 1])
bottommost = np.max(edge_coordinates[:, 0])
# 計算長和寬
width = rightmost - leftmost
height = bottommost - topmost
# 繪製矩形框
cv2.rectangle(image, (leftmost, topmost), (rightmost, bottommost), (0, 255, 0), 2)
# 輸出寬度和高度
print(f"寬度: {width}, 高度: {height}")
# 顯示結果圖像
cv2.imshow('Result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

方法說明

此方法應用到Numpy中的where,column_stack,min,max

np.where(condition, [x, y]):根據條件返回元素位置的索引。np.column_stack(tup):將一系列1-D 序列(列表、元組、數組等)按列堆疊以形成一個多列的數組

min : 返回最小值

max : 返回最大值

實現方法: 

1. np.where(img > 0) 找出每個非0的索引

2. 利用np.column_stack推疊出每個非0(y,x)座標

3. 利用Max, Min找找非0的索引(y,x)座標的最大最小值

4. Max值 – Min值  = 長 或 寬

方法詳細說明:

1. 在圖像中,黑 = 0,白等於255,先將想要偵測的物件利用二值化方法變成白色,在用np.where方法找到圖片中非0的位子

2. 找到這些非0的位子,實際上就是物件每一個白色的點的位子,利用np.column_stack把他推疊起來

3. 在圖像中,第一個索引通常對應圖像的垂直軸(y 軸),而第二個索引對應水平軸(x 軸),由此可得知在那推資料中,我若要得到物件的寬,就要知道對應圖像中 最左邊跟最右邊的座標位子

4. 最左邊的座標,從剛推疊白色的座標點的list中,找到X的最小值就是最左邊的,最大值就是最右邊,(最大值 減 最小值) 就得到寬度了

圖像座標x,y解釋

其他應用

[OpenCV Python應用]遮罩,旋轉,輪廓應用濾除斑點

[OpenCV Python應用]利用SIFT得取圖片物件旋轉角度,並旋轉回正常角度

謝謝大家觀看,若有問題歡迎留言提問喔~

喜歡的話,愛心追蹤,才不會錯過最新更新


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.