Python Opencv基于透视变换的图像矫正

本文实例为大家分享了Python Opencv基于透视变换的图像矫正,供大家参考,具体内容如下

一、自动获取图像顶点变换(获取图像轮廓顶点矫正)

图像旋转校正思路如下

1、以灰度图读入
2、腐蚀膨胀,闭合等操作
3、二值化图像
4、获取图像顶点
5、透视矫正

#(基于透视的图像矫正)
import cv2
import math
import numpy as np

def Img_Outline(input_dir):
    original_img = cv2.imread(input_dir)
    gray_img = cv2.cvtColor(original_img, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray_img, (9, 9), 0)                     # 高斯模糊去噪(设定卷积核大小影响效果)
    _, RedThresh = cv2.threshold(blurred, 165, 255, cv2.THRESH_BINARY)  # 设定阈值165(阈值影响开闭运算效果)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))          # 定义矩形结构元素
    closed = cv2.morphologyEx(RedThresh, cv2.MORPH_CLOSE, kernel)       # 闭运算(链接块)
    opened = cv2.morphologyEx(closed, cv2.MORPH_OPEN, kernel)           # 开运算(去噪点)
    return original_img, gray_img, RedThresh, closed, opened

def findContours_img(original_img, opened):
    image, contours, hierarchy = cv2.findContours(opened, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
    c = sorted(contours, key=cv2.contourArea, reverse=True)[1]   # 计算最大轮廓的旋转包围盒
    rect = cv2.minAreaRect(c)                                    # 获取包围盒(中心点,宽高,旋转角度)
    box = np.int0(cv2.boxPoints(rect))                           # box
    draw_img = cv2.drawContours(original_img.copy(), [box], -1, (0, 0, 255), 3)

    print("box[0]:", box[0])
    print("box[1]:", box[1])
    print("box[2]:", box[2])
    print("box[3]:", box[3])
    return box,draw_img

def Perspective_transform(box,original_img):
    # 获取画框宽高(x=orignal_W,y=orignal_H)
    orignal_W = math.ceil(np.sqrt((box[3][1] - box[2][1])**2 + (box[3][0] - box[2][0])**2))
    orignal_H= math.ceil(np.sqrt((box[3][1] - box[0][1])**2 + (box[3][0] - box[0][0])**2))

    # 原图中的四个顶点,与变换矩阵
    pts1 = np.float32([box[0], box[1], box[2], box[3]])
    pts2 = np.float32([[int(orignal_W+1),int(orignal_H+1)], [0, int(orignal_H+1)], [0, 0], [int(orignal_W+1), 0]])

    # 生成透视变换矩阵;进行透视变换
    M = cv2.getPerspectiveTransform(pts1, pts2)
    result_img = cv2.warpPerspective(original_img, M, (int(orignal_W+3),int(orignal_H+1)))

    return result_img

if __name__=="__main__":
    input_dir = "../staticimg/oldimg_04.jpg"
    original_img, gray_img, RedThresh, closed, opened = Img_Outline(input_dir)
    box, draw_img = findContours_img(original_img,opened)
    result_img = Perspective_transform(box,original_img)
    cv2.imshow("original", original_img)
    cv2.imshow("gray", gray_img)
    cv2.imshow("closed", closed)
    cv2.imshow("opened", opened)
    cv2.imshow("draw_img", draw_img)
    cv2.imshow("result_img", result_img)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

直接变换

1、获取图像四个顶点
2、形成变换矩阵
3、透视变换

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('original_img.jpg')
H_rows, W_cols= img.shape[:2]
print(H_rows, W_cols)

# 原图中书本的四个角点(左上、右上、左下、右下),与变换后矩阵位置
pts1 = np.float32([[161, 80], [449, 12], [1, 430], [480, 394]])
pts2 = np.float32([[0, 0],[W_cols,0],[0, H_rows],[H_rows,W_cols],])

# 生成透视变换矩阵;进行透视变换
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (500,470))

"""
注释代码同效
# img[:, :, ::-1]是将BGR转化为RGB
# plt.subplot(121), plt.imshow(img[:, :, ::-1]), plt.title('input')
# plt.subplot(122), plt.imshow(dst[:, :, ::-1]), plt.title('output')
# plt.show
"""

cv2.imshow("original_img",img)
cv2.imshow("result",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

两次透视变换

def get_warp_perspective(img, width, height, array_points, array_points_get, array_points_warp):
    middle_len = 268
    # rows, cols = img.shape[:2]
    # D_value1 = (middle_len - array_points_get[0][1])*2+((middle_len - array_points_get[0][1])//3)
    # D_value2 = (middle_len - array_points_get[1][1])*2+((middle_len - array_points_get[1][1])//3)
    D_value1 = 0
    D_value2 = 0
    # 原图中的四个角点
    # pts1 = np.float32([[0, 249],[512, 253],[0, 512], [512, 512]])#重要的测试1和2
    pts1 = np.float32(array_points_get)#重要的测试1和2

    # pts2 = np.float32([[0, middle_len], [width, middle_len], [0, height], [width, height]])#重要的测试1和2
    # pts2 = np.float32([[0, middle_len],[0, height] , [width, height],[width, middle_len]])#重要的测试1和2
    pts2 = np.float32([[0, 0],[0, middle_len] , [width, middle_len],[width, 0]])#重要的测试1和2

    # 生成透视变换矩阵
    M = cv2.getPerspectiveTransform(pts1, pts2)
    # 进行透视变换
    dst = cv2.warpPerspective(img, M, (width, height))
    # # 保存图片,仅用于测试
    img_path = './cut_labels/cut_image_one.jpg'
    cv2.imwrite(img_path, dst)

    return warp_perspective(dst, width, height,array_points,array_points_warp,middle_len, D_value1, D_value2)

def warp_perspective(dst, width, height,array_points,array_points_warp,middle_len, D_value1, D_value2):
    # new_img_path = img_path
    # img = cv2.imread(new_img_path)
    # 原图的保存地址
    # rows, cols = img.shape[:2]

    # 原图中的四个角点
    # pts3 = np.float32([[0, 268], [0, 44], [512,35], [512, 268]])#重要测试1
    # pts3 = np.float32([[0, middle_len], [0, D_value1], [512,D_value2], [512, middle_len]])#重要测试1
    pts3 = np.float32([[0, 0], [0, height], [width, height], [width, 0]])
    # pts3 = np.float32([[0, middle_len], [0, D_value1], [512,D_value2], [512, middle_len]])#重要测试1
    # pts3 = np.float32([[0, 512], [0, array_points[1][1]], [512,512], [512, middle_len]])#重要测试1
    # 变换后的四个角点
    pts4 = np.float32([[0, 0], [0, height-D_value1], [width, height-D_value2], [width, 0]])#重要测试1
    # pts4 = np.float32([[0, 268], [0, 0], [512, 0], [512, 268]])#重要测试1
    # 生成透视变换矩阵
    M = cv2.getPerspectiveTransform(pts3, pts4)
    # 进行透视变换
    dst_img = cv2.warpPerspective(dst, M, (width, height))
    # #保存最终图片,仅用于测试
    print("++++++++++++++++")
    final_img_path = './cut_labels/cut_image_two.jpg'
    cv2.imwrite(final_img_path, dst_img)
    # 进行透视变换
    return cv2.warpPerspective(dst_img, M, (width, height))
    # return output_warp_perspective(img, width, height, array_points, array_points_get, array_points_warp)

if __name__  == "__main__":
    # 透视转换
       img = cv2.imread('../staticimg/oldimg_04.jpg')
     dst = get_warp_perspective(img, 512, 512, array_points=[[395.2, 75.0], [342, 517], [1000, 502], [900, 75]])
     cv2.imwrite('aaa2.jpg', dst)
     cv2.imshow('title', dst)
     cv2.waitKey(0)
     imgrectificate = imgRectificate(img, width, height, array_points)
     imgrectificate.warp_perspective()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Opencv-Python图像透视变换cv2.warpPerspective的示例

    Opencv-Python图像透视变换cv2.warpPerspective 代码如下: # -*- coding:utf-8 -*- import cv2 import numpy as np import sys img = cv2.imread('test.jpg') # cv2.imshow("original", img) # 可选,扩展图像,保证内容不超出可视范围 img = cv2.copyMakeBorder(img, 200, 200, 200, 200, cv2.B

  • Python图像处理之透视变换的实战应用

    目录 1 引言 2 公式 3 举例 4 应用 4.1 读入图像 4.2 挑选源图四个点 4.3 进行透视变换 5 应用 6 总结 1 引言 如果你想对图像进行校准,那么透视变换是非常有效的变换手段.透视变换的定义为将图像投影到一个新的视平面,通常也被称之为投影映射. 2 公式 一般来说,通用的图像变换公式如下所示: 上述公式中,u,v代表原始图像坐标,x,y为经过透视变换的图片坐标,其中变换矩阵为3X3形式.进而可以得到: 3 举例 在介绍opencv的透视变换函数之前,我们举例来讲解该算法的原

  • 详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强

    前言 这周和大家分享如何用python识别图像里的条码.用到的库可以是zbar.希望西瓜6辛苦码的代码不要被盗了.(zxing的话,我一直没有装好,等装好之后再写一篇) 具体步骤 前期准备 用opencv去读取图片,用pip进行安装. pip install opencv-python 所用到的图片就是这个 使用pyzbar windows的安装方法是 pip install pyzbar 而mac的话,最好用brew来安装. (有可能直接就好,也有可能很麻烦) 装好之后就是读取图片,识别条码.

  • python opencv实现任意角度的透视变换实例代码

    本文主要分享的是一则python+opencv实现任意角度的透视变换的实例,具体如下: # -*- coding:utf-8 -*- import cv2 import numpy as np def rad(x): return x * np.pi / 180 img = cv2.imread("6.jfif") cv2.imshow("original", img) # 扩展图像,保证内容不超出可视范围 img = cv2.copyMakeBorder(img,

  • Python Opencv基于透视变换的图像矫正

    本文实例为大家分享了Python Opencv基于透视变换的图像矫正,供大家参考,具体内容如下 一.自动获取图像顶点变换(获取图像轮廓顶点矫正) 图像旋转校正思路如下 1.以灰度图读入2.腐蚀膨胀,闭合等操作3.二值化图像4.获取图像顶点5.透视矫正 #(基于透视的图像矫正) import cv2 import math import numpy as np def Img_Outline(input_dir):     original_img = cv2.imread(input_dir)

  • Python OpenCV 基于图像边缘提取的轮廓发现函数

    基础知识铺垫 在图像中,轮廓可以简单的理解为连接具有相同颜色的所有连续点(边界)的曲线,轮廓可用于形状分析和对象检测.识别等领域. 轮廓发现的原理:先通过阈值分割提取目标物体,再通过边缘检测提取目标物体轮廓. 一个轮廓就是一系列的点(像素),这些点构成了一个有序的点集合. 使用 cv2.findContours 函数可以用来检测图像的边缘. 函数原型说明 contours, hierarchy = cv2.findContours(image, mode, method[, contours[,

  • Python OpenCV基于霍夫圈变换算法检测图像中的圆形

    目录 第一章:霍夫变换检测圆 ① 实例演示1 ② 实例演示2 ③ 霍夫变换函数解析 第二章:Python + opencv 完整检测代码 ① 源代码 ② 运行效果图 第一章:霍夫变换检测圆 ① 实例演示1 这个是设定半径范围 0-50 后的效果. ② 实例演示2 这个是设定半径范围 50-70 后的效果,因为原图稍微大一点,半径也大了一些. ③ 霍夫变换函数解析 cv.HoughCircles() 方法 参数分别为:image.method.dp.minDist.param1.param2.mi

  • Python OpenCV基于HSV的颜色分割实现示例

    目录 前言 1.什么是HSV 2.代码实战 2.1 createTrackbar使用方法及步骤 2.2 代码详解 3.总结 前言 一周没有更新博客了,这一周的时间内加强了对机器学习和图像处理的学习.学的有点混乱,有必要记录一下. 深度学习可以解决很多问题,但有时候深度学习和图像处理相结合才能有更好的效果:比如,在进行交通信号灯检测时,用目标检测模型确定信号灯位置后,对信号灯进行颜色分割再识别可大大提高准确率. 机器学习领域中有句话:数据和特征决定了模型的上限,而算法只不过是逼近这个上限而已,所以

  • Python+OpenCV实现基于颜色的目标识别

    目录 任务 主要代码 效果展示 学习了一点opencv的知识于是找了个小项目来实践一下.这里先说明一下,我的实现方法不见得是最好的(因为这只是一个用于练习的项目)仅作参考,也欢迎各位大佬指正. 任务 让摄像头识别到视野范围内的气球并返回每个气球的中心点坐标. 因为场地固定,背景单一,所以省下来很多操作和处理.于是就有两种解决思路:第一种是基于气球形状做轮廓提取,只要是闭合椭圆或圆形形就认为是目标物体:第二种是基于气球颜色,只要符合目标物体的颜色就认为是目标物体. 因为摄像头是装在四足机器人(它的

  • python opencv实现图像矫正功能

    本文实例为大家分享了python opencv实现图像矫正的具体代码,供大家参考,具体内容如下 问题简介 一般的我们对图像中的目标进行分析和检测时,往往目标具有一定的倾斜角度,自然环境中正面向我们的目标实际是很少的,那将这些倾斜的目标“扶正”的过程就就叫做图像矫正. 透视变换demo 图像矫正使用的主要技术是透视变换.python-opencv 透视变换demo如下: import cv2 import numpy as np img = cv2.imread('/home/pzs/图片/1.j

  • 基于Python OpenCV和 dlib实现眨眼检测

    目录 了解"眼睛纵横比"(EAR) 使用面部标志和 OpenCV 检测眨眼 眨眼检测结果 总结 今天,我们使用面部标记和 OpenCV 检测视频流中的眨眼次数. 为了构建我们的眨眼检测器,我们将计算一个称为眼睛纵横比 (EAR) 的指标,该指标由 Soukupová 和 Čech 在他们 2016 年的论文<使用面部标记的实时眨眼检测>中介绍. 与计算眨眼的传统图像处理方法不同,传统的图像处理方法通常涉及以下某些组合: 眼睛定位. 阈值以找到眼白. 确定眼睛的"白

  • 基于python opencv单目相机标定的示例代码

    相机固定不动,通过标定版改动不同方位的位姿进行抓拍 import cv2 camera=cv2.VideoCapture(1) i = 0 while 1: (grabbed, img) = camera.read() cv2.imshow('img',img) if cv2.waitKey(1) & 0xFF == ord('j'): # 按j保存一张图片 i += 1 u = str(i) firename=str('./img'+u+'.jpg') cv2.imwrite(firename

  • 基于Python+OpenCV制作屏幕录制工具

    目录 应用平台 屏幕录制部分 计算视频最优fps及使用numpy计算中间帧数组 使用pynput监听键盘按键 如何保存MP4格式视频 源码 总结 最近有在使用屏幕录制软件录制桌面,在用的过程中突发奇想,使用python能不能做屏幕录制工具,也锻炼下自己的动手能力.接下准备写使用python如何做屏幕录制工具的系列文章: 录制屏幕制作视频 录制音频 合成视频,音频 基于pyqt5制作可视化窗口 大概上述四个部分,希望自己能够尽快完善,接下来开始使用python制作屏幕录制部分. 应用平台 wind

随机推荐