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------实现图像校正

【任务描述】

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

【代码】

python 复制代码
# 图像校正示例
import cv2
import numpy as np
import math

im = 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 = approx
            break

print(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()

【执行结果】

相关推荐
花千树-0103 分钟前
IndexTTS2 在 macOS 性能最佳设置(M1/M2/M3/M4 全适用)
人工智能·深度学习·macos·ai·语音识别·ai编程
DS随心转插件3 分钟前
手机怎么把豆包全部对话导出
人工智能·ai·智能手机·deepseek·ai导出鸭
MarkHD3 分钟前
从“能跑”到“好用”:Python脚本监控与告警实战(邮件/钉钉/企业微信)
python·钉钉·企业微信
电磁脑机4 分钟前
论AI幻觉的本质:人类符号幻觉的镜像映射与认知破局 ——基于三场正交统一场论的底层阐释
人工智能·神经网络·机器学习·重构·架构
AI袋鼠帝5 分钟前
Solo独立端来了!Trae想让普通人也能拥有顶级Agent(附免费邀请码)
人工智能
盼小辉丶6 分钟前
PyTorch实战(40)——使用PyTorch构建推荐系统
人工智能·pytorch·深度学习·推荐系统
大学有意思7 分钟前
哪些学校支持考研跨门类调剂?以南林大2026年调剂政策为例
人工智能·机器人
Coding茶水间8 分钟前
基于深度学习的草莓健康度检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Django+web+训练代码+数据集)
人工智能·深度学习·yolo·机器学习·django
数琨创享TQMS质量数智化8 分钟前
Sigmar TQMS: 车间质量数智化管控平台技术选型指南
大数据·人工智能·qms质量管理系统·tqms·质量管理工具
北顾笙9808 分钟前
深度学习day06
人工智能·深度学习