opencv实现文档矫正

 更新时间:2022年08月01日 10:52:00   作者:棒子胡豆  
这篇文章主要为大家详细介绍了opencv实现文档矫正功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了opencv实现文档矫正的具体代码,供大家参考,具体内容如下

原始文档

矫正后文档

思路:

只要获得倾斜文档的倾斜角度,然后通过仿射变化旋转一下就可以实现矫正了,这里获取倾斜角度的方法有两个,下面分别介绍

1、利用霍夫变换,文档内容都是平行的,首先利用利用霍夫变换检测直线,然后将所有直线的平均倾斜角度当做文档的倾斜角度,最后再进行仿射变换就可以了。

import cv2
import numpy as np
def imshow(img):
    cv2.imshow("img",img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
img = cv2.imread("2.png",1)
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
img2 = img.copy()
img_canny = cv2.Canny(img,75,200) 
img_line = cv2.HoughLines(img_canny,1,np.pi/180,280)
average = 0
for line in img_line: 
    for rho,theta in line:
        average = average + theta 
average = average / len(img_line)
angel = average/np.pi * 180 - 90
def rotateImg(img,angel):
    rows, cols = img.shape
    M = cv2.getRotationMatrix2D(((cols - 1) / 2.0, (rows - 1) / 2.0), angel, 1)  # 旋转中心x,旋转中心y,旋转角度,缩放因子
    img = cv2.warpAffine(img, M, (cols, rows),borderValue = (255,255,255))  #在内存里完成了旋转
    imshow(img)
rotateImg(img2,angle)

2、求文档内容的最小包围矩形。首先检测轮廓,利用形态学操作求mask,然后再检测轮廓,求最下包围矩形,最小包围矩形会返回一个倾斜角度(度数,霍夫变换的倾斜角度是弧度制),可以对轮廓进行筛选,将面积最大的轮廓的倾斜角度作为文档的倾斜角度,然后做仿射变换。

import cv2
import numpy as np
def imshow(img):
    cv2.imshow("img",img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
img = cv2.imread("2.png",1)
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
img2 = img.copy()
imgth = cv2.threshold(img,0,255,cv2.THRESH_OTSU|cv2.THRESH_BINARY_INV)[1]
kernel = np.ones((17,17))
img_open = cv2.morphologyEx(imgth,cv2.MORPH_CLOSE,kernel,10)
# imshow(img_open)
cons = cv2.findContours(img_open,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)[0]
areas = []
for con in cons:
    area = cv2.contourArea(con)
    areas.append(area)
index = areas.index(max(areas))
# 度数形式,霍夫变换的返回值是弧度制
rect = cv2.minAreaRect(cons[index])
angle = rect[2]
mat = cv2.getRotationMatrix2D((img.shape[1]/2,img.shape[0]/2),angle,1)
img_fin = cv2.warpAffine(img,mat,(img.shape[1],img.shape[0]),borderValue = (255,255,255))
imshow(img_fin)

补充:

利用仿射变换实现图像旋转指定度数

mat = cv2.getRotationMatrix2D(center,angle,c) (center: 旋转中心,angle:旋转角度,c:缩放大小)
img_final = cv2.warpAffine(img,mat, (img.shape[1],img.shape[0]), borderValue = (255,255,255)) (borderValue为可选参数,填充色,默认为黑色)

另外旋转指定90,180,270可以使用transpose、flip来实现

旋转90度(顺时针)
img = cv2.transpose(img)
res_img = cv2.flip(img,1)

旋转180度
img = cv2.flip(img,0)
img = cv2.flip(img,1)

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

相关文章

  • 使用 Python 获取 Linux 系统信息的代码

    使用 Python 获取 Linux 系统信息的代码

    在本文中,我们将会探索使用Python编程语言工具来检索Linux系统各种信息,需要的朋友可以参考下
    2014-07-07
  • Python中利用Scipy包的SIFT方法进行图片识别的实例教程

    Python中利用Scipy包的SIFT方法进行图片识别的实例教程

    SIFT算法可以检测图片中的局部特征,算法原理相当复杂...但是!Python强大的第三方包Scipy中带有实现SIFT算法的SIFT方法,我们只要拿来用就可以了,下面就为大家带来Python中利用Scipy包的SIFT方法进行图片识别的实例教程.
    2016-06-06
  • Python 使用type来定义类的实现

    Python 使用type来定义类的实现

    今天小编就为大家分享一篇Python 使用type来定义类的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 如何使用 python查询Amazon DynamoDB

    如何使用 python查询Amazon DynamoDB

    本文介绍了如何使用Python Boto3在Amazon DynamoDB上查询DynamoDB 表、创建、列出和执行其他 CRUD 活动以及执行其他维护任务,本文给大家介绍的非常详细,需要的朋友参考下
    2023-06-06
  • 详解python路径拼接os.path.join()函数的用法

    详解python路径拼接os.path.join()函数的用法

    os.path.join()函数:连接两个或更多的路径名组件。这篇文章主要介绍了python路径拼接os.path.join()函数的用法,需要的朋友可以参考下
    2019-10-10
  • LeetCode百钱买百鸡python递归解法示例

    LeetCode百钱买百鸡python递归解法示例

    这篇文章主要为大家介绍了LeetCode百钱买百鸡题目python递归解法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • python实现上传下载文件功能

    python实现上传下载文件功能

    这篇文章主要为大家详细介绍了python实现上传下载文件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Python技能树共建之python urllib 模块

    Python技能树共建之python urllib 模块

    这篇文章介绍了Python技能树共建之python urllib 模块,urllib模块是 Python 标准库,更多相关介绍需要的小伙伴可以参考下面文章的详细内容
    2022-05-05
  • Python 2.6.6升级到Python2.7.15的详细步骤

    Python 2.6.6升级到Python2.7.15的详细步骤

    这篇文章主要介绍了Python 2.6.6升级到Python2.7.15的详细步骤,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • python的print输出在控制台并且将输出内容保存为文件(最新推荐)

    python的print输出在控制台并且将输出内容保存为文件(最新推荐)

    这篇文章主要介绍了python的print输出在控制台并且将输出内容保存为文件,我感觉就是类似于重写一下调用print的时候执行的方法,让他既能够在控制台输出,也能保存到文件里去,需要的朋友可以参考下
    2023-01-01

最新评论