用opencv校正图片的方向

打印 上一主题 下一主题

主题 1675|帖子 1675|积分 5025

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
校正的过程可以分为以下几步:

1、转灰度图。

2、降噪。

3、Canny边缘检测。

4、膨胀。

5、表面检索。

6、从各个表面中选取合适的旋转角度并校正图像。

  1. import cv2
  2. import numpy as np
  3. def resize_image(image, scale_factor):
  4.     """调整图像大小"""
  5.     return cv2.resize(
  6.         image, None, fx=scale_factor, fy=scale_factor, interpolation=cv2.INTER_AREA
  7.     )
  8. def main():
  9.     # 读取图像
  10.     src = cv2.imread("images/c3.jpg")
  11.     if src is None:
  12.         print("无法读取图像,请检查路径是否正确!")
  13.         return
  14.     # 调整图像大小以便展示
  15.     scale_factor = 0.5  # 缩放比例
  16.     src_resized = resize_image(src, scale_factor)
  17.     cv2.imshow("src", src_resized)
  18.     # 转灰度图
  19.     gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
  20.     gray_resized = resize_image(gray, scale_factor)
  21.     cv2.imshow("gray", gray_resized)
  22.     # 高斯模糊降噪
  23.     blur = cv2.GaussianBlur(gray, (5, 5), 1.0)
  24.     blur_resized = resize_image(blur, scale_factor)
  25.     cv2.imshow("gaussianBlur", blur_resized)
  26.     # Canny边缘检测
  27.     canny = cv2.Canny(blur, 20, 100)
  28.     canny_resized = resize_image(canny, scale_factor)
  29.     cv2.imshow("canny", canny_resized)
  30.     # 膨胀两次,让文字连到一块
  31.     kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (4, 2))
  32.     expand = cv2.dilate(canny, kernel, iterations=2)
  33.     expand_resized = resize_image(expand, scale_factor)
  34.     cv2.imshow("dialate", expand_resized)
  35.     # 检索轮廓
  36.     contours, _ = cv2.findContours(expand, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
  37.     # 对各个轮廓的旋转角度进行排序
  38.     vecAngles = []
  39.     for contour in contours:
  40.         rr = cv2.minAreaRect(contour)
  41.         vecAngles.append(rr[2])  # RotatedRect.angle
  42.     vecAngles.sort()
  43.     # 以中间值为基准,取相差20%以内的角度的平均值作为结果
  44.     midIndex = int(len(vecAngles) / 2) - 1
  45.     midAngle = vecAngles[midIndex]
  46.     maxAngleThreshold = midAngle + 15 if midAngle > 0 else midAngle - 15
  47.     minAngleThreshold = midAngle - 15 if midAngle > 0 else midAngle + 15
  48.     print("maxAngleThreshold:", maxAngleThreshold)
  49.     print("minAngleThreshold:", minAngleThreshold)
  50.     angleSum = 0
  51.     angleCounter = 0
  52.     for angle in vecAngles:
  53.         print(angle)
  54.         if minAngleThreshold < angle < maxAngleThreshold:
  55.             angleSum += angle
  56.             angleCounter += 1
  57.     averageAngle = angleSum / angleCounter if angleCounter > 0 else 0
  58.     print("averageAngle:", averageAngle)
  59.     print("midAngle:", midAngle)
  60.     # 旋转图像
  61.     (h, w) = src.shape[:2]
  62.     center = (w // 2, h // 2)
  63.     rotateM = cv2.getRotationMatrix2D(center, averageAngle, 1.0)
  64.     result = cv2.warpAffine(
  65.         src,
  66.         rotateM,
  67.         (w, h),
  68.         flags=cv2.INTER_LINEAR,
  69.         borderMode=cv2.BORDER_CONSTANT,
  70.         borderValue=(255, 255, 255),
  71.     )
  72.     result_resized = resize_image(result, scale_factor)
  73.     cv2.imshow("result", result_resized)
  74.     # 保存最终结果
  75.     output_path = "result.jpg"
  76.     cv2.imwrite(output_path, result)
  77.     print(f"最终结果已保存到:{output_path}")
  78.     cv2.waitKey(0)
  79.     cv2.destroyAllWindows()
  80. if __name__ == "__main__":
  81.     main()
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表