使用python和opencv高效查找大尺寸圖片白色區域中的圓形
本文介紹如何使用Python和OpenCV庫,高效處理9000×7000像素的大尺寸圖片,準確識別其中白色區域內的圓形。 直接處理如此高分辨率的圖片效率低下,因此我們將采用圖像縮放、二值化和霍夫變換等技術優化處理流程。
原始方法中使用霍夫變換檢測圓形,但結果包含大量冗余信息。為了提高準確性,我們需要改進算法,主要步驟如下:
- 圖像縮放: 使用cv2.resize函數縮小圖像尺寸,降低計算復雜度,同時保持足夠的細節用于圓形識別。
- 灰度轉換: 將彩色圖像轉換為灰度圖像,簡化后續處理。
- 二值化: 使用cv2.threshold函數將灰度圖像二值化,將白色區域與其他區域清晰地區分開。 這里設置合適的閾值至關重要,可以根據圖片的實際情況調整。
- 霍夫圓變換: 使用cv2.HoughCircles函數進行霍夫圓變換,檢測圖像中的圓形。 參數需要根據圖像特點進行微調,例如param1和param2控制邊緣檢測的敏感度和累加器閾值。
- 圓形篩選: 對檢測到的圓形進行篩選,只保留位于白色區域內的圓形。 通過檢查圓心周圍區域的像素平均灰度值是否高于設定的閾值來實現。
以下是一個改進后的Python代碼示例:
import cv2 import numpy as np image_path = r"C:Users17607Desktopsmls picturesPic_20231122151507973.bmp" # 請替換為你的圖片路徑 def detect_circles(image_path): # 讀取圖像 img = cv2.imread(image_path) # 縮放圖像 (調整縮放比例根據實際情況修改) img = cv2.resize(img, (img.shape[1] // 10, img.shape[0] // 10)) # 轉換為灰度圖像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化處理 (調整閾值根據實際情況修改) _, thresh = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY) # 霍夫圓變換 (調整參數根據實際情況修改) circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 40, param1=50, param2=30, minRadius=0, maxRadius=0) if circles is not None: circles = np.round(circles[0, :]).astype("int") for (x, y, r) in circles: # 篩選位于白色區域的圓形 (調整閾值根據實際情況修改) if np.mean(thresh[y - r:y + r, x - r:x + r]) > 200: cv2.circle(img, (x, y), r, (0, 255, 0), 2) # 畫出圓圈 cv2.circle(img, (x, y), 2, (0, 0, 255), 3) # 畫出圓心 return img result_image = detect_circles(image_path) cv2.imshow("Detected Circles", result_image) cv2.waitKey(0) cv2.destroyAllwindows()
此代碼首先縮放圖像以提高效率,然后進行灰度轉換和二值化處理,再使用霍夫圓變換檢測圓形。最后,通過檢查圓形區域的平均灰度值來篩選出位于白色區域內的圓形,并將其繪制在圖像上。 請根據實際圖像調整代碼中的閾值和霍夫變換參數以獲得最佳結果。 這比之前的版本更簡潔高效,并提供了更清晰的注釋。
立即學習“Python免費學習筆記(深入)”;
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END