当前位置: 首页 > 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.mrgr.cn/news/61959.html

相关文章:

  • 深度学习的加速器:Horovod,让分布式训练更简单高效!
  • 探索AGI:智能助手与自我赋能的新时代
  • 【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法,以及自动化实时数据采集
  • 一文读懂「LoRA」:大型语言模型的低秩适应
  • CatLog的使用
  • ubuntu安装ssh9.2
  • 【网络】1.UDP通信
  • 空气断路器和真空断路器介绍
  • 端到端拥塞控制的公平性和稳定性
  • 一个方法助你快速取消Word文档只读模式
  • HTTP的初步了解
  • golang gin ShouldBind的介绍和使用
  • LivePortrait——生成可拼接和重定向控制的高效肖像动画翻译
  • 【约束优化】一次搞定拉格朗日,对偶问题,弱对偶定理,Slater条件和KKT条件
  • asp.net webapi实现FileStreamResult
  • Maven下载安装配置(环境、本地仓库、阿里云、jdk、idea)(Win11)
  • 论分布式存储系统架构设计
  • 为什么资产管理中会用到RFID系统
  • NavVis LX系列产品典型应用—现有住宅装修改造-沪敖3D
  • 使用SPM为ios项目添加lookin所遇问题总结
  • 记MySQL下一次DEPENDENT SUBQUERY的优化
  • 从0学习React(10)
  • 代码随想录算法训练营第三十一天|Day31 贪心算法
  • 【PG高可用】patroni配置文件
  • 怎样禁止运行电脑某个软件(如何禁止运行电脑软件)?3分钟学会这4招!
  • Educational Codeforces Round 171