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)

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

(0)

相关推荐

  • 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实现任意角度二维码矫正

    目录 前言 一般图片矫正方式 二维码图片矫正 思路 编码实现 前言 那天听到领导他们在讨论,说要将图片进行个矫正处理,还叫来了算法部的大佬来讨论将要如何处理这个,讨论场面很是激烈 不得不说好奇心是个很神奇的东西,就把我给吸引过去了 我定眼一看,感觉作为JAVA开发的我自己也能进行处理 因为看到了图片后,发现了图片中一个很重要的特征点: 要进行矫正的图片中都会有一个二维码图案,想要矫正的文字和二维码图案是处于同一水平线的. 如下面这个 要把图片中的“水中加点糖”四个字矫正,只需要把二维码矫正就可以

  • Python OpenCV 图像矫正的原理实现

    目录 题目描述 基本思路 核心代码 题目描述 目录hw1下的图像是一些胶片的照片,请将其进行度量矫正. 推荐流程:采用Canny算子,检测边缘点:采用Hough直线检测,根据边缘点检测胶片边缘对应的4条直线:4条直线在图像平面中的交点为胶片图像的4个顶点.根据4个顶点与真实世界中胶片的位置(假设胶片图像长宽比为4:3),得到两个平面之间的单应变换矩阵,并根据单应变换矩阵实现图像矫正. 基本思路 使用Canny算子,检测边缘点:以边缘点作为输入,采用Hough直线检测,检测出最多点共线的四条直线,

  • 使用python opencv对畸变图像进行矫正的实现

    代码: __Author__ = "Shliang" __Email__ = "shliang0603@gmail.com" import os import cv2 import numpy as np from tqdm import tqdm def undistort(frame): fx = 685.646752 cx = 649.107905 fy = 676.658033 cy = 338.054431 k1, k2, p1, p2, k3 = -0.

  • python opencv实现图像矫正功能

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

  • opencv+python实现图像矫正

    本文实例为大家分享了opencv+python实现图像矫正的具体代码,供大家参考,具体内容如下 需求:将斜着拍摄的文本图像进行矫正 python代码 import numpy as np import cv2 as cv def shape_correction(img):     (height, width) = img.shape[:2]     print(img.shape)     img_gau = cv.GaussianBlur(img, (5, 5), 0)     canny

  • C++ OpenCV实现文档矫正功能

    目录 需求 思路 代码 效果 需求 将一个斜着拍摄的文档矫正成正的,如图所示: 思路 1.读取原始图像,若图像太大可以先进行缩放处理,并获取原始图像的宽和高 2.对图像进行预处理得到边缘,依次进行灰度处理.高斯模糊.边缘检测.膨胀.腐蚀. 3.找到最大的轮廓,并提取角点 进行降噪处理:检测轮廓面积,只保留大于阈值面积的轮廓 计算每个轮廓的周长,使用DP算法计算出轮廓点的个数,规则为周长*0.02 找到图像中面积最大的,且角点为4的轮廓 4.将找到的四个角点排列成一个固定的顺序,排列后的顺序为:左

  • opencv实现文档矫正

    本文实例为大家分享了opencv实现文档矫正的具体代码,供大家参考,具体内容如下 原始文档 矫正后文档 思路: 只要获得倾斜文档的倾斜角度,然后通过仿射变化旋转一下就可以实现矫正了,这里获取倾斜角度的方法有两个,下面分别介绍 1.利用霍夫变换,文档内容都是平行的,首先利用利用霍夫变换检测直线,然后将所有直线的平均倾斜角度当做文档的倾斜角度,最后再进行仿射变换就可以了. import cv2 import numpy as np def imshow(img):     cv2.imshow("i

  • opencv python简易文档之图像处理算法

    目录 将图片转为灰度图 HSV 图像阈值 图像平滑 形态学-腐蚀操作 形态学-膨胀操作 开运算与闭运算 梯度运算 礼帽与黑帽 图像梯度处理 Canny边缘检测 图像金字塔 图像轮廓 直方图 直方图均衡化: 自适应均衡化: 傅里叶变换 模板匹配 总结 上一篇已经给大家介绍了opencv python图片基本操作的相关内容,这里继续介绍图像处理算法,下面来一起看看吧 将图片转为灰度图 import cv2 #opencv读取的格式是BGR img=cv2.imread('cat.jpg') # 将图

  • opencv python简易文档之图片基本操作指南

    前言 最近在学习opencv,使用的是python接口.于是想着写些相关的笔记供以后参考,有不足之处希望大家指出. 使用python学习opencv需要下载opencv第三方库. 使用pip安装即可. 安装命令: pip install opencv-python pip install opencv-contrib-python(opencv的贡献库) 引入opencv import cv2 读取图片: img=cv2.imread('cat.jpg') # cat.jpg路径为相对路径 #

  • 手把手教你利用opencv实现人脸识别功能(附源码+文档)

    目录 一.环境 二.使用Haar级联进行人脸检测 三.Haar级联结合摄像头 四.使用SSD的人脸检测 五. SSD结合摄像头人脸检测 六.结语 一.环境 pip install opencv-python python3.9 pycharm2020 人狠话不多,直接上代码,注释在代码里面,不说废话. 二.使用Haar级联进行人脸检测 测试案例: 代码:(记得自己到下载地址下载对应的xml) # coding=gbk """ 作者:川川 @时间 : 2021/9/5 16:3

  • Python+OpenCV实战之实现文档扫描

    目录 1.效果展示 2.项目准备 3.代码的讲解与展示 4.项目资源 5.项目总结与评价 1.效果展示 网络摄像头扫描: 图片扫描: 最终扫描保存的图片: (视频) (图片) 2.项目准备 今天的项目文件只需要两个.py文件,其中一个.py文件是已经写好的函数,你将直接使用它,我不会在此多做讲解,因为我们将会在主要的.py文件import 导入它,如果想了解其中函数是如何写的,请自行学习. utlis.py,需要添加的.py文件 import cv2 import numpy as np # T

  • C++ OpenCV实战之文档照片转换成扫描文件

    目录 一.背景 二.基础知识 三.方案一:自动检测点 1.读取图片文件(进行了指定尺寸缩放) 2.创建直线类并计算两条直线的交点 3.图像边缘检测Canny 4.通过霍夫变换进行直线检测 5.求单应性矩阵 6.降噪和二值化 四.方案二:用户点选目标区域 1.命令行解析 2.鼠标事件 3.主函数实现 4.结果展示 五.总结 一.背景 前段时间都是基于Python的OpecCV进行一些学习和实践,但小的知识点并没有应用到实际的项目中:并且基于Python的版本的移植性.效率性都较差,在包含硬件的项目

  • Java实现去除文档阴影的示例代码

    目录 一.前言 二.实现原理 1. 图像 2. 灰度转换 3.阈值处理 三.代码实现 1.读取图像 2.阈值处理 一.前言 文稿扫描大家用的都比较频繁.想是各种证件.文件都可以通过扫描文稿功能保存到手机.相比直接拍照,在扫描文稿时,程序会对图像进行一些矫正.比如去除阴影.修正倾斜.旋转矫正等.进行这些处理后的图片要更加容易识别.今天就来讨论以下去除阴影的操作. 二.实现原理 1. 图像 在开始实现前,我们来了解一些图像相关的知识.这里讨论RGB图像,也就是我们俗称的彩色的图像.图像可以被看作是一

  • remote script文档(转载自微软)(九)

    文档: 等待方法 终止当前正执行的客户脚本,直到指定调用对象的异步 remote scripting 调用完成. 语法 co.wait() 参数 co  执行 remote scripting 调用而生成的调用对象. 说明 调用该方法将把一个异步 remote scripting 调用转换为同步调用.如果 remote scripting 调用已完成,那么该方法将立即返回.如果您在客户脚本中遇到这种情况──需要来自 remote scripting 调用的结果,那么这种调用是有用的. 示例 下面

  • remote script文档(转载自微软)(八)

    文档: 调用对象属性和方法 当您调用一个服务器方法时,该方法不返回单个值.而是创建一个调用对象,该对象包含被调用过程的返回值和状态信息.下表列出了调用对象的属性. 属性 描述  id 调用的唯一标识号,它是首次调用时产生的.  return_value 方法的返回值──如果有的话.  data 产生 remote scripting 调用时,服务器返回的粗数据,是以 XML 标记封装的.有关详细信息,请参阅检查错误.  status 指示方法调用当前状态的值.可能值包括: -1 失败 0 完成

随机推荐