python與opencv高效提取9000×7000像素圖片中的兩個圓形區域
處理超高分辨率圖像(例如9000×7000像素)并從中提取特定形狀(例如圓形)是圖像處理和計算機視覺中的常見挑戰。本文提供一種使用Python和OpenCV庫的解決方案,高效準確地提取目標圓形區域。
現有代碼存在的問題是:檢測到的圓形過多,無法精確選取所需的兩處圓形區域。 為了改進,我們將采用以下策略:
- 圖像預處理:縮放與降噪:首先,為了提高處理效率,我們將原始圖像縮小至合適的尺寸。同時,應用高斯模糊濾波器來減少圖像噪聲,從而提高圓形檢測的準確性。
import cv2 import numpy as np image_path = r"c:users17607desktopsmls picturespic_20231122151507973.bmp" # 讀取圖像 img = cv2.imread(image_path) # 縮放圖像 (調整縮放比例根據實際情況) scale_percent = 10 # 縮放至原圖的1/10 width = int(img.shape[1] / scale_percent) height = int(img.shape[0] / scale_percent) dim = (width, height) resized_img = cv2.resize(img, dim, interpolation=cv2.INTER_AREA) # 灰度轉換 gray = cv2.cvtColor(resized_img, cv2.COLOR_BGR2GRAY) # 高斯模糊 blurred = cv2.GaussianBlur(gray, (5, 5), 0)
- 邊緣檢測:Canny算法:使用Canny邊緣檢測算法提取圖像邊緣信息,為后續圓形檢測做準備。
# Canny邊緣檢測 edges = cv2.Canny(blurred, 50, 150)
- 圓形檢測:霍夫變換:利用霍夫圓變換(HoughCircles)檢測圖像中的圓形。關鍵在于參數調整,以確保只檢測到我們需要的兩個圓形。這里我們根據圓的半徑大小進行篩選,選擇兩個最大的圓形。
# 霍夫圓變換 circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 40, param1=50, param2=30, minRadius=0, maxRadius=0) if circles is not None: circles = np.uint16(np.around(circles)) # 選擇兩個最大的圓 circles = circles[0, :] circles = circles[np.argsort(circles[:, 2])[::-1][:2]] # 選擇半徑最大的兩個圓 for i in circles: center_x, center_y, radius = i # 在縮放后的圖像上繪制圓形 cv2.circle(resized_img, (center_x, center_y), radius, (0, 0, 255), 2) cv2.circle(resized_img, (center_x, center_y), 2, (255, 0, 0), 3) cv2.imshow("Detected Circles", resized_img) cv2.waitKey(0) cv2.destroyAllwindows()
通過以上步驟,我們可以有效地從高分辨率圖像中提取出兩個最大的圓形區域,并通過可視化結果進行驗證。 需要注意的是,scale_percent 和霍夫變換的參數需要根據實際圖像進行調整,以達到最佳的檢測效果。 如果兩個圓形大小相近,可能需要根據圓心坐標或其他特征進行更精細的選擇。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END