当前位置: 首页 > news >正文

OpenCV基本操作(python开发)——(7)实现图像校正

OpenCV基本操作(python开发)——(1) 读取图像、保存图像
OpenCV基本操作(python开发)——(2)图像色彩操作
OpenCV基本操作(python开发)——(3)图像形态操作
OpenCV基本操作(python开发)——(4)图像梯度处理
OpenCV基本操作(python开发)——(5)轮廓处理
OpenCV基本操作(python开发)——(6)视频基本处理
OpenCV基本操作(python开发)——(7)实现图像校正
OpenCV基本操作(python开发)——(8)实现芯片瑕疵检测

OpenCV——实现图像校正

【任务描述】

我们对图像中的目标进行分析和检测时,目标往往具有一定的倾斜角度,自然条件下拍摄的图像,完全平正是很少的。因此,需要将倾斜的目标“扶正”的过程就就叫做图像矫正。该案例中使用的原始图像如下:

在这里插入图片描述

【代码】

# 图像校正示例
import cv2
import numpy as np
import mathim = cv2.imread("../data/paper.jpg")
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.imshow('im', im)# 模糊
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 膨胀
dilate = cv2.dilate(blurred, (3, 3))
# 检测边沿
edged = cv2.Canny(dilate,  # 原始图像30, 120)  # 滞后阈值、模糊度
# cv2.imshow("edged", edged)# 轮廓检测
img, cnts, hie = cv2.findContours(edged.copy(),cv2.RETR_EXTERNAL,  # 只检测外轮廓cv2.CHAIN_APPROX_SIMPLE)  # 只保留该方向的终点坐标
docCnt = None# 绘制轮廓
im_cnt = cv2.drawContours(im,  # 绘制图像cnts,  # 轮廓点列表-1,  # 绘制全部轮廓(0, 0, 255),  # 轮廓颜色:红色2)  # 轮廓粗细
cv2.imshow("im_cnt", im_cnt)# 计算轮廓面积,并排序
if len(cnts) > 0:cnts = sorted(cnts,  # 数据key=cv2.contourArea,  # 排序依据,根据contourArea函数结果排序reverse=True)for c in cnts:peri = cv2.arcLength(c, True)  # 计算轮廓周长approx = cv2.approxPolyDP(c, 0.02 * peri, True)  # 轮廓多边形拟合# 轮廓为4个点表示找到纸张if len(approx) == 4:docCnt = approxbreakprint(docCnt)# 用圆圈标记处角点
points = []
for peak in docCnt:peak = peak[0]# 绘制圆cv2.circle(im,  # 绘制图像tuple(peak), 10,  # 圆心、半径(0, 0, 255), 2)  # 颜色、粗细points.append(peak)  # 添加到列表
print(points)
cv2.imshow("im_point", im)# 校正
src = np.float32([points[0], points[1], points[2], points[3]])  # 原来逆时针方向四个点
dst = np.float32([[0, 0], [0, 488], [337, 488], [337, 0]])  # 对应变换后逆时针方向四个点
m = cv2.getPerspectiveTransform(src, dst)  # 生成透视变换矩阵
result = cv2.warpPerspective(gray.copy(), m, (337, 488))  # 透视变换"""  根据勾股定理计算宽度、高度,再做透视变换
h = int(math.sqrt((points[1][0] - points[0][0])**2 + (points[1][1] - points[0][1])**2)) # 宽度
w = int(math.sqrt((points[2][0] - points[1][0])**2 + (points[2][1] - points[1][1])**2)) # 高度
print("w:", w, " h:", h)
dst = np.float32([[0, 0], [0, h], [w, h], [w, 0]])
m = cv2.getPerspectiveTransform(src, dst)  # 生成透视变换矩阵
result = cv2.warpPerspective(gray.copy(), m, (w, h))  # 透视变换
"""cv2.imshow("result", result)  # 显示透视变换结果cv2.waitKey()
cv2.destroyAllWindows()

【执行结果】

在这里插入图片描述

http://www.lryc.cn/news/475204.html

相关文章:

  • [项目] C++基于多设计模式下的同步异步日志系统
  • Vue常用的修饰符有哪些?
  • AnatoMask的分层图像编码器-解码器
  • 面向对象编程的核心特性:封装、继承、多态与抽象
  • ubuntu openmpi安装(超简单)
  • Python中的SQL数据库管理:SQLAlchemy教程
  • LeetCode --- 421周赛
  • 简单了解前缀树/字典树(Trie树)C++代码
  • ubuntu安装与配置Nginx(2)
  • Linux环境下Mongodb部署
  • (九)JavaWeb后端开发——Servlet
  • 【零售和消费品&家居用品】家庭门窗开闭状态安全监控系统源码&数据集全套:改进yolo11-DCNV2
  • 【JavaScript】axios 二次封装拦截器(接口、实例、全局)
  • Linux_02 Linux常用软件——vi、vim
  • C++代码优化--要求或禁止在堆中产生对象
  • MybatisPlus入门(六)MybatisPlus-空值处理
  • 钉钉内集成第三方免密登录(Vue+.Net)
  • 卷积神经网络实验三:模型优化(1)
  • STM32F103的CAN通讯接收测试
  • 【Rust中的智能指针】
  • 基于深度学习的社交网络中的社区检测
  • 【Python基础】
  • 【玉米叶部病害识别】Python+深度学习+人工智能+图像识别+CNN卷积神经网络算法+TensorFlow
  • 【设计模式】如何用C++实现依赖倒置
  • 使用onnxruntime-web 运行yolov8-nano推理
  • Gin框架html/vue前端使用hls.js播放/点播m3u8(hls)格式视频
  • HarmonyOS 私仓搭建
  • Mybatis学习笔记(二)
  • Google“Big Sleep“人工智能项目发现真实软件漏洞
  • npm入门教程5:package.json