在高分辨率图片中查找白色圆形区域,核心思路是先通过图像预处理降低计算复杂度,再结合圆形检测算法和颜色筛选逻辑,实现高效精准的定位。高分辨率图片通常像素量大,直接计算会消耗大量资源,因此需要先对图片做合理处理再执行检测。

前期预处理步骤
高分辨率图片直接传入检测算法会导致计算量激增,首先需要对图片做缩放处理,同时保留白色圆形的核心特征。可以通过以下步骤完成预处理:
- 将图片转为灰度图,减少通道计算量
- 对图片做适当缩放,比如缩放到原图的1/4或者1/2,根据圆形实际大小调整缩放比例
- 通过颜色阈值筛选白色区域,缩小检测范围
- 可选做高斯模糊,减少噪点对检测结果的干扰
核心检测实现
这里使用OpenCV的霍夫圆变换实现圆形检测,结合白色区域的掩码过滤非目标圆形,具体代码实现如下:
import cv2
import numpy as np
def find_white_circles(image_path, scale=0.25, min_radius=10, max_radius=100):
# 读取原始高分辨率图片
original_img = cv2.imread(image_path)
if original_img is None:
raise ValueError("无法读取图片,请检查路径是否正确")
# 缩放图片降低计算量
height, width = original_img.shape[:2]
resized_img = cv2.resize(original_img, (int(width * scale), int(height * scale)))
# 转为灰度图
gray = cv2.cvtColor(resized_img, cv2.COLOR_BGR2GRAY)
# 筛选白色区域,白色像素值通常在200以上
_, white_mask = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)
# 对掩码做高斯模糊减少噪点
blurred_mask = cv2.GaussianBlur(white_mask, (5, 5), 2)
# 霍夫圆变换检测圆形,参数可根据实际场景调整
circles = cv2.HoughCircles(
blurred_mask,
cv2.HOUGH_GRADIENT,
dp=1,
minDist=min_radius * 2,
param1=50,
param2=20,
minRadius=min_radius,
maxRadius=max_radius
)
result_circles = []
if circles is not None:
circles = np.round(circles[0, :]).astype("int")
for (x, y, r) in circles:
# 将缩放后的坐标转回原图坐标
original_x = int(x / scale)
original_y = int(y / scale)
original_r = int(r / scale)
result_circles.append((original_x, original_y, original_r))
return result_circles, original_img, resized_img
# 调用示例
circles, original, resized = find_white_circles("test_high_res.jpg", scale=0.25, min_radius=20, max_radius=150)
print(f"检测到{len(circles)}个白色圆形区域")参数调优建议
不同场景下的高分辨率图片特征不同,需要调整对应参数提升检测效果:
- scale参数:如果圆形较小,可适当调大scale值,避免缩放后圆形特征丢失;圆形较大则调小scale值提升速度
- 白色阈值:根据实际白色区域的亮度调整阈值,避免把浅灰色区域误判为白色
- 霍夫圆变换的param2:值越小检测到的圆形越多,值越大检测要求越严格,可根据准确率需求调整
- 半径范围:提前明确目标圆形的大致半径范围,缩小检测区间减少无效计算
结果验证
检测完成后可以在原图上绘制圆形验证结果,代码如下:
def draw_circles(original_img, circles):
result_img = original_img.copy()
for (x, y, r) in circles:
# 绘制圆形轮廓
cv2.circle(result_img, (x, y), r, (0, 255, 0), 2)
# 绘制圆心
cv2.circle(result_img, (x, y), 2, (0, 0, 255), 3)
return result_img
# 绘制结果并保存
result_img = draw_circles(original, circles)
cv2.imwrite("detected_result.jpg", result_img)如果检测过程中遇到圆形漏检或者误检的情况,可以逐步调整预处理步骤和检测参数,直到满足实际需求。这种方法相比直接处理原图,速度可以提升数倍,同时准确率也能得到保障。