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


猜你喜欢
- 下面是一段产生log-normal分布的代码,以此进行说明。clear all;clc;for t=1:100 Traffic(t) =cu
- 为什么,这么简单的一个python,我还要特意来写一篇文章呢?是因为留念下,在使用了Anaconda2和Anaconda3的基础上,现在需安
- 时间库—arrow使用背景日期时间处理在实际应用场景中无处不在,所以这也成了编程语言中必不可少的模块,Python 也不例外。但是,你知道在
- 前言大家应该经常在朋友圈看到有人发九宫格图片,其实质就是将一张图片切成九份,然后在微信中一起发这九张图即可。说到切图,Python 就可以实
- 在前一篇博客我们学习了 Go 数组,其要求所有元素为同一数据类型,如果希望存储不同类型的数据,就要用到结构体相关知识。结构体的定义:存储相同
- 1.引入css与jsbootstrapValidator.min.cssbootstrapValidator.min.js2.html中的m
- 本文实例为大家分享了Python tkinter实现计算器功能的具体代码,供大家参考,具体内容如下python版本:3.5一.计算器的功能描
- 这篇论坛文章详细介绍了完全卸载MySQL数据库5.0的具体方法,更多内容请参考下文:数据库突然出了问题,没办法只能重装,因为事先并不知道My
- 近段时间由于修改一个ASP程序(有SQL注入漏洞),在网上找了很多相关的一些防范办法,都不近人意,所以我将现在网上的一些方法综合改良了一下,
- 爬取了下小猪短租的网站出租房信息但是输出的时候是这种:百度了下。python2.7在window上的编码确实是个坑解决如下如果是个字典的话要
- 1、安装有两种安装方法:方法一:从Mac自带的python安装,命令如下:$brewinstall python如果出错的话前面加上sudo
- 前期准备订单测试表CREATE TABLE `trade` ( `id` VARCHAR(50) NULL DEFAU
- javascript函数的定义1:调用关键字function来构造,如:function distance(x1,x2,y1,y2){var
- 前言:这篇文章给大家介绍了怎样用python创建一个简单的报警,它可以运行在命令行终端,它需要分钟做为命令行参数,在这个分钟后会打印”wak
- 本文实例讲述了Go语言实现定时器的方法。分享给大家供大家参考。具体实现方法如下:package mainimport ( &quo
- 本文实例讲述了Python实现链表反转的方法。分享给大家供大家参考,具体如下:Python实现链表反转链表反转(while迭代实现):链表的
- 因些朋友发来邮件讲根据文章修改后无效,懒羊再次检查后发现在工具栏中并无添加,所以还得做一下下面步骤,再此给大家造成的不便还请多多谅解!因FC
- 一:使用Python中的urllib类中的urlretrieve()函数,直接从网上下载资源到本地,具体代码:import os,stati
- 第一次碰到这个问题的时候,确实不知道该怎么办,后来请教了一个大神,加上自己的理解,才了解是什么意思,这个东西写python的会经常用到,而且
- vue中form data形式传参vue项目中form data形式传参,需要在headers中添加如下代码headers: {