You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于OpenCV的图像倾斜校正:无参考图能否实现硬币图像校正?

无参考图像下的硬币倾斜校正方案

可以实现,核心思路是利用硬币本身的正圆形几何特性——倾斜拍摄的正圆形会呈现为椭圆,通过拟合椭圆并推导透视变换矩阵,就能将椭圆还原为正圆,实现倾斜校正。

具体实现步骤(基于OpenCV + NumPy):

  • 图像预处理

    1. 先把RGB数组转灰度图:gray = cv2.cvtColor(rgb_array, cv2.COLOR_RGB2GRAY)
    2. 用大津法二值化分离硬币和背景:_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    3. 用椭圆结构元素做开运算去除小噪声:
      kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
      cleaned_binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
      
  • 拟合硬币椭圆轮廓

    1. 提取图像中的外部轮廓:contours, _ = cv2.findContours(cleaned_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    2. 筛选出面积最大的轮廓(对应硬币主体):coin_contour = max(contours, key=cv2.contourArea)
    3. 对轮廓拟合椭圆:ellipse = cv2.fitEllipse(coin_contour),结果包含椭圆的中心坐标、长/短轴长度、旋转角度
  • 计算透视变换矩阵
    椭圆的长轴长度等于硬币实际直径,我们需要把椭圆映射为正圆:

    1. 取椭圆的四个特征点作为变换源点:比如椭圆的上下顶点、左右顶点
    2. 设定目标正圆的四个对应点:以椭圆中心为圆心,长轴一半为半径,取正圆的上下左右四个顶点
    3. 用cv2.getPerspectiveTransform(src_points, dst_points)生成变换矩阵M,注意点要按对应顺序排列
  • 执行校正变换
    用生成的矩阵对原RGB数组做透视变换:

    target_size = (int(ellipse[1][0]), int(ellipse[1][0]))  # 以长轴长度为目标图像边长
    corrected_img = cv2.warpPerspective(rgb_array, M, target_size)
    

注意事项

  • 如果背景复杂,预处理可以结合颜色阈值(比如提取硬币的金属色区域)来提升轮廓准确性
  • 拟合椭圆前要确保硬币轮廓完整,避免被遮挡或噪声干扰
  • 变换后可能需要裁剪边缘的黑边,保留完整的硬币区域

内容的提问来源于stack exchange,提问作者dev_neil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:50:26