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

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

#(基于透视的图像矫正)
import cv2
import math
import numpy as npdef 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, openeddef 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))                           # boxdraw_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_imgdef 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_imgif __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 = 0D_value2 = 0# 原图中的四个角点# pts1 = np.float32([[0, 249],[512, 253],[0, 512], [512, 512]])#重要的测试1和2pts1 = 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和2pts2 = 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]])#重要测试1pts3 = 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()

Python-Opencv基于透视变换的图像矫正相关推荐

  1. python opencv 实现透视变换——将侧视图进行正投影

    python opencv 实现透视变换--将侧视图进行正投影 这个方法可以将倾斜拍摄的四边形图片投影成矩形,在图像处理工程里经常要用,之前写过一个C语言版本的,可以搜我博客:透视变换 但是pytho ...

  2. 【Python+OpenCV 图像透视变换 warpPerspective函数】

    Python+OpenCV 图像透视变换 warpPerspective函数 1.函数介绍 2.代码实例 3.实现效果 1.函数介绍 warpPerspective():对图像进行透视变换.简单来说, ...

  3. Python OpenCV基于颜色通道分离法去除图片中的红色印章

    最近一段时间的工作都是研究如何去除图片中的红色印章,在网上查找了大量的大佬写过的方法,发现大多数是采取颜色通道分离法来做,并且效果还不错.站在前人的肩膀上,我又做了些许调整,谈不上是改进,但是能应对更 ...

  4. python写透视挂_如何用Python openCV 用透视变换的方法对图像进行矫正

    .需要矫正的图片1 需要矫正的图 矫正后的结果: 矫正后的图 需要矫正的图片2 矫正前 矫正后 # import the necessary packages from imutils.perspec ...

  5. Python - Opencv应用实例之头发自动分割、计数、特征统计智能分析系统

    Python-Opencv应用实例之头发自动分割.计数.特征统计智能分析系统 简介: 本文章将通过Python+Opencv基于传统图像处理算法实现头发的自动分析功能. 自动分割:对图像中的头发丝实现 ...

  6. OpenCV—python 图像矫正(基于傅里叶变换—基于透视变换)

    文章目录 一.基于傅里叶变换的图像矫正 1.1 傅里叶变换原理 1.2 傅里叶变换过程一系列函数 1.3 图像矫正处理流程 二.旋转图像矫正 三.基于透视的图像矫正 3.1 直接变换 3.2 自动获取 ...

  7. 基于python+opencv的图像目标区域自动提取

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 一.提取纸张中的内容 一张照片中的感兴趣区域总是沿着x,y,z三个轴都有一定倾斜(如下图),要 ...

  8. Python,OpenCV基于支持向量机SVM的手写数字OCR

    Python,OpenCV基于支持向量机SVM的手写数字OCR 1. 效果图 2. SVM及原理 2. 源码 2.1 SVM的手写数字OCR 2.2 非线性SVM 参考 上一节介绍了基于KNN的手写数 ...

  9. 文档扫描仪的构建——使用Python,OpenCV应用透视变换来获得图像的自顶向下的“鸟瞰图”

    使用Python,OpenCV应用透视变换来获得图像的自顶向下的"鸟瞰图" 1. 效果图 2. 应用透视变换的步骤 3. 优化:矩形角点的获取 4. 源码 参考 这篇博客演示了如何 ...

最新文章

  1. 本日吐槽!“人傻钱多”的P2P公司是否是程序员的合适选择(群聊天记录的娱乐)...
  2. SpringBoot加itext实现PDF导出
  3. 【渝粤题库】广东开放大学 标准化专题讲座 形成性考核
  4. 13.4. 临时表是否需要建索引
  5. 内存对齐还是需要重视的——XMMATRIX 为例
  6. CentOS上 安装NodeJS
  7. 2017总结、2018展望
  8. JSON字符串和对象之间的转换
  9. 【C++】为什么INT_MIN不是直接写成-2147483648(转载)
  10. python读取dicom序列_python读取dicom图像(SimpleITK和dicom包实现)
  11. 【python】自动发送微信消息或文件
  12. 一个OA系统升级实施方案
  13. 51单片机简单计算器
  14. 干货!纯干货! 手把手教你做云专线互联网备援接入-上集
  15. 运算放大器单电源设计
  16. 美国华盛顿州立大学计算机排名,2020年华盛顿州立大学排名TFE Times美国最佳计算机科学硕士专业排名第38...
  17. 虹科分享 | 压力蒸汽灭菌器确认之BD测试
  18. 智慧工厂数字孪生 数字孪生工厂 工厂数字孪生
  19. php memcached mysql_php memcached+Mysql(主从)
  20. oracle物理读优化,oracle 性能优化 06_sql优化

热门文章

  1. OCR - 微软windows 11系统自带的Windows OCR功能初体验
  2. java jsp servlet mysql 菜市场管理系统
  3. Golang交叉编译Sqlite3踩坑记录
  4. java获取视频详细信息并截图做封面的两种实现方式
  5. 求助,哪位大佬能帮助我解决一下这个问题,感激不尽
  6. 记录畅享9 Plus安装谷歌三件套
  7. gio中文乱码解决方式
  8. 电脑一声,电脑开机后会响一声,是什么原因呢?
  9. 快速找到路由器Ip地址在哪里查询
  10. 分发新模式 TestFlight,苹果官方认可,零风险,分发再无忧