Python?OpenCV實現(xiàn)圖像形狀檢測
圖像形狀檢測是計算機視覺領(lǐng)域中的一項關(guān)鍵技術(shù),廣泛應用于工業(yè)自動化、機器人視覺、醫(yī)學圖像處理等多個領(lǐng)域。本文將詳細介紹如何使用Python和OpenCV庫實現(xiàn)圖像形狀檢測,通過簡潔明了的步驟和代碼示例,幫助你快速掌握這一技能。
一、環(huán)境準備
在開始之前,確保你的電腦上已經(jīng)安裝了Python和OpenCV庫。你可以通過以下命令來安裝OpenCV庫:
pip install opencv-python
同時,確保你能夠編寫和運行Python代碼,并熟悉基本的圖像處理概念。
二、讀取和預處理圖像
讀取圖像
使用OpenCV的cv2.imread()函數(shù)讀取圖像文件。例如,讀取一張包含不同形狀的圖像:
import cv2
# 讀取圖像
img = cv2.imread('shapes.png')
灰度化
將彩色圖像轉(zhuǎn)換為灰度圖像,以簡化后續(xù)處理。使用cv2.cvtColor()函數(shù):
# 轉(zhuǎn)換為灰度圖像 gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
濾波去噪
使用高斯模糊來去除圖像中的噪聲。高斯模糊是一種常用的圖像處理技術(shù),可以平滑圖像并減少噪聲干擾。使用cv2.GaussianBlur()函數(shù):
# 高斯模糊 blurred_img = cv2.GaussianBlur(gray_img, (5, 5), 0)
三、邊緣檢測
邊緣檢測是形狀檢測的重要步驟,它可以幫助我們找到圖像中的輪廓。使用Canny邊緣檢測算法,該算法是一種常用的邊緣檢測算法,具有良好的邊緣檢測效果。使用cv2.Canny()函數(shù):
# Canny邊緣檢測 edges = cv2.Canny(blurred_img, 50, 150)
四、查找輪廓
使用cv2.findContours()函數(shù)查找圖像中的輪廓。該函數(shù)會返回輪廓點集、層次結(jié)構(gòu)和輪廓的近似方法。我們主要關(guān)注輪廓點集:
# 查找輪廓 contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
五、繪制輪廓
為了可視化檢測到的輪廓,我們可以使用cv2.drawContours()函數(shù)在原圖像上繪制輪廓:
# 繪制輪廓 contour_img = img.copy() cv2.drawContours(contour_img, contours, -1, (0, 255, 0), 2)
六、形狀分類
根據(jù)輪廓的頂點數(shù)目、面積、周長等特征,我們可以對檢測到的形狀進行分類。以下是一個簡單的形狀分類示例:
for contour in contours:
# 計算輪廓面積
area = cv2.contourArea(contour)
# 計算輪廓周長
perimeter = cv2.arcLength(contour, True)
# 近似輪廓為多邊形
epsilon = 0.02 * perimeter
approx = cv2.approxPolyDP(contour, epsilon, True)
# 獲取輪廓頂點數(shù)目
num_vertices = len(approx)
# 根據(jù)頂點數(shù)目判斷形狀
shape = 'Unknown'
if num_vertices == 3:
shape = 'Triangle'
elif num_vertices == 4:
# 判斷是否為正方形或矩形
x, y, w, h = cv2.boundingRect(approx)
aspect_ratio = w / float(h)
if 0.95 < aspect_ratio < 1.05:
shape = 'Square'
else:
shape = 'Rectangle'
elif num_vertices == 5:
shape = 'Pentagon'
elif num_vertices == 6:
shape = 'Hexagon'
else:
# 對于頂點數(shù)目大于6的形狀,可以根據(jù)周長面積比等特征進一步分類
# 例如,圓形可以通過周長面積比接近某個閾值來判斷
if 4 * 3.14 * (area / 3.14) ** 0.5 / perimeter > 0.8 and 4 * 3.14 * (area / 3.14) ** 0.5 / perimeter < 1.2:
shape = 'Circle'
else:
shape = 'Other Polygon'
# 在圖像上標注形狀名稱和頂點數(shù)目
M = cv2.moments(contour)
if M['m00'] != 0:
cX = int(M['m10'] / M['m00'])
cY = int(M['m01'] / M['m00'])
else:
cX, cY = 0, 0
cv2.putText(contour_img, f'{shape} ({num_vertices} vertices)', (cX - 50, cY - 50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)
cv2.drawContours(contour_img, [approx], -1, (0, 0, 255), 2)七、顯示結(jié)果
最后,使用cv2.imshow()函數(shù)顯示處理后的圖像:
# 顯示結(jié)果圖像
cv2.imshow('Shape Detection', contour_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
八、完整代碼示例
以下是完整的代碼示例,將上述步驟整合在一起:
import cv2
# 讀取圖像
img = cv2.imread('shapes.png')
# 轉(zhuǎn)換為灰度圖像
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯模糊
blurred_img = cv2.GaussianBlur(gray_img, (5, 5), 0)
# Canny邊緣檢測
edges = cv2.Canny(blurred_img, 50, 150)
# 查找輪廓
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 繪制輪廓并分類形狀
contour_img = img.copy()
for contour in contours:
# 計算輪廓面積
area = cv2.contourArea(contour)
# 計算輪廓周長
perimeter = cv2.arcLength(contour, True)
# 近似輪廓為多邊形
epsilon = 0.02 * perimeter
approx = cv2.approxPolyDP(contour, epsilon, True)
# 獲取輪廓頂點數(shù)目
num_vertices = len(approx)
# 根據(jù)頂點數(shù)目判斷形狀
shape = 'Unknown'
if num_vertices == 3:
shape = 'Triangle'
elif num_vertices == 4:
# 判斷是否為正方形或矩形
x, y, w, h = cv2.boundingRect(approx)
aspect_ratio = w / float(h)
if 0.95 < aspect_ratio < 1.05:
shape = 'Square'
else:
shape = 'Rectangle'
elif num_vertices == 5:
shape = 'Pentagon'
elif num_vertices == 6:
shape = 'Hexagon'
else:
# 對于頂點數(shù)目大于6的形狀,可以根據(jù)周長面積比等特征進一步分類
# 例如,圓形可以通過周長面積比接近某個閾值來判斷
if 4 * 3.14 * (area / 3.14) ** 0.5 / perimeter > 0.8 and 4 * 3.14 * (area / 3.14) ** 0.5 / perimeter < 1.2:
shape = 'Circle'
else:
shape = 'Other Polygon'
# 在圖像上標注形狀名稱和頂點數(shù)目
M = cv2.moments(contour)
if M['m00'] != 0:
cX = int(M['m10'] / M['m00'])
cY = int(M['m01'] / M['m00'])
else:
cX, cY = 0, 0
# 繪制形狀名稱和頂點數(shù)目
cv2.putText(contour_img, f'{shape} ({num_vertices} vertices)', (cX - 50, cY - 50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)
# 繪制輪廓(近似多邊形)
cv2.drawContours(contour_img, [approx], -1, (0, 0, 255), 2)
# 顯示結(jié)果圖像
cv2.imshow('Shape Detection', contour_img)
cv2.waitKey(0)
cv2.destroyAllWindows()九、總結(jié)
本文介紹了如何使用Python和OpenCV庫實現(xiàn)圖像形狀檢測。通過環(huán)境準備、圖像預處理、邊緣檢測、輪廓查找、繪制輪廓及形狀分類等步驟,展示了完整的圖像形狀檢測流程。利用高斯模糊、Canny邊緣檢測和輪廓近似等技術(shù),實現(xiàn)了對圖像中不同形狀的有效檢測與分類。通過示例代碼,讀者可以快速掌握圖像形狀檢測的基本方法和技巧,為工業(yè)自動化、機器人視覺等領(lǐng)域的實際應用提供有力支持。
到此這篇關(guān)于Python OpenCV實現(xiàn)圖像形狀檢測的文章就介紹到這了,更多相關(guān)Python OpenCV形狀檢測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Python dict存中文字符dumps()的問題
這篇文章主要介紹了關(guān)于Python dict存中文字符dumps()的問題,本文給大家分享問題及解決方案,給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-10-10
Django-xadmin后臺導入json數(shù)據(jù)及后臺顯示信息圖標和主題更改方式
這篇文章主要介紹了Django-xadmin后臺導入json數(shù)據(jù)及后臺顯示信息圖標和主題更改方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03

