opencv+python实现图像矫正
作者:椰树林YSL 发布时间:2022-09-28 09:28:14
标签: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 = cv.Canny(img_gau, 60, 200)
# cv.imshow("g-canny", canny)
kernel = cv.getStructuringElement(cv.MORPH_CROSS, (4,3))
dilated = cv.dilate(canny, kernel, iterations=8)
# cv.imshow('img_dilated', dilated)
# 寻找轮廓
contours, hierarchy = cv.findContours(dilated, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
# print(len(contours), hierarchy, sep='\n')
# 找到最外层面积最大的轮廓
area = 0
# print("area:{}".format(area))
index = 0
for i in range(len(contours)):
x, y, w, h = cv.boundingRect(contours[i])
# 排除非文本区域
if w < 35 and h < 35:
continue
# 防止矩形区域过大不精准
if h > 0.99 * height or w > 0.99 * width:
continue
# draw rectangle around contour on original image
# cv.rectangle(img, (x, y), (x + w, y + h), (255, 0, 255), 2)
tmpArea = w * h
if tmpArea >= area:
area = tmpArea
index = i
# 得到最小外接矩形的(中心(x,y), (宽,高), 旋转角度)
rect = cv.minAreaRect(contours[index])
# 画出矩形框
# box = cv.boxPoints(rect)
# box = np.int0(box)
# cv.drawContours(img, [box], 0, (0, 0, 255), 2)
# cv.imshow('img', img)
print("rect:{}".format(rect))
angle = rect[-1]
# print(angle)
# 角度大于85度或小于5度不矫正
if angle > 85 or angle < 5:
angle = 0
elif angle < 45:
angle = angle - 0
else:
angle = angle - 90
M = cv.getRotationMatrix2D(rect[0], angle, 1)
rotated = cv.warpAffine(img, M, (width, height), flags=cv.INTER_CUBIC, borderValue=(255, 255, 255))
cv.imshow('Rotated', rotated)
return rotated
src = cv.imread('/res-normal.png', 0)
rotated = shape_correction(src)
cv.waitKey(0)
算法流程
算法核心思想:
获取图像中的文本区域矩形轮廓,找到其中面积最大的,对其进行最小外接矩形计算,得到最小外接矩形的旋转角度,再根据旋转角度进行仿射变换。
测试效果
来源:https://blog.csdn.net/xsydalao/article/details/121544626
0
投稿
猜你喜欢
- 1. 打开FrontPage 2003,点击“文件→新建→新建网站→其他网站模板”,然后选择“数据库界面向导”,给定网站路径后,单击[确定]
- 由于工作对人的眼球和精神都会带来一定的疲劳,所以在界面设计中,希望用户能够准确的关注重要的信息,而不因为用户的长期使用而流失信息。最近在看《
- function.js<!--function getObject(objectId) { &nbs
- 现在有一个xml,格式如下: 代码如下:<date> <item> <id>&nbs
- 老师罚学生抄写英文单词,结果学生给抄成这样……
- this指向当前作用域的对象,如果找不到,往上一层找,直到window。this 关键字很好用,很灵活,正因为很灵活,所以一不小心你就会掉进
- 本文实例讲述了Python使用dict.fromkeys()快速生成一个字典。分享给大家供大家参考,具体如下:>>> re
- 有向无环图拓扑排序是针对有向无环图(DAG, Directed Acyclic Graph)的具有以下性质:如果这个图不是 DAG,那么它是
- 栈(stack)栈又称之为堆栈是一个特殊的有序表,其插入和删除操作都在栈顶进行操作,并且按照先进后出,后进先出的规则进行运作。如下图所示例如
- 简化了一下 YUI3 中的沙箱实现 方式:if (typeof Sandbox === 'undefined' || !Sa
- 经常看见有人问,MSSQL占用了太多的内存,而且还不断的增长;或者说已经设置了使用内存,可是它没有用到那么多,这是怎么一回事儿呢? 首先,我
- '''数据集:伪造数据集(两个高斯分布混合)数据集长度:1000--------------------------
- 在利用QT编写GUI程序时经常需要一些交互操作,常见的有鼠标事件、键盘事件等。今天我们要实现的是在label中已经显示的图像中绘制矩形框,以
- PHP获取当前url路径的函数及服务器变量:代码:<?php$path = /usr/opt/../ect/abcd;echo $_S
- Python 风格规范(Google)本项目并非 Google 官方项目, 而是由国内程序员凭热情创建和维护。如果你关注的是 Google
- PHP addslashes() 函数实例在每个双引号(")前添加反斜杠:<?php $str = addslashes(&
- 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。GET方式提交的数据
- 这个验证类的完成有很长时间了,一直没有分享给大家使用了这么长时间之后感觉挺顺手,用于一些不需要特殊效果的表单验证个人认为已经足够了,还是挺好
- import timeimport paramikoclass HandleParamiko: '''
- 本文实例讲述了php将textarea数据提交到mysql出现很多空格的解决方法。分享给大家供大家参考。具体分析如下:有一些朋友可能会发现我