python直线水平_基于直线勘测水平图像矫正——python
文本的水平矫正,在一定程度上跟普通的水平矫正不太一样,普通的水平矫正图像都会带有自己的边缘,根据边缘可以提取出一个框架,然后进行旋转即可。但是文本图像的背景是白色的,所以没有办法像发票,报纸那类有明显边界的矩形物体那样,提取出轮廓并旋转矫正。
所以通过对文本图像的水平矫正可以避免这个问题。
1、霍夫变换
霍夫变换主要是利用图片所在的空间和霍夫空间之间的变换,将图片所在的直角坐标系中具有形状的曲线或直线映射到霍夫空间的一个点上形成峰值,从而将检测任意形状的问题转化成了计算峰值的问题。即在图片所在的直角坐标系的一个直线,转换到霍夫空间便成了一点,并且是由多条直线相交而成,而统计的峰值也就是该相交点的橡胶线的条数。
一条直线在图像中是一系列离散点的集合,通过一个直线的离散极坐标公式,可以表达出直线的离散点几何等式:X *cos(theta) + Y * sin(theta) = r 其中角度theta指r与X轴之间的夹角,r为到直线几何垂直距离。
2、基于直线的矫正思路
在图像处理领域上,图像的像素坐标P(x, y)是已知的,而r, theta则是要寻找的变量。如果能绘制每个(r, theta)值根据像素点坐标P(x, y)值的话,那么就从图像笛卡尔坐标系统转换到极坐标霍夫空间系统,这种从点到曲线的变换称为直线的霍夫变换。变换通过量化霍夫参数空间为有限个值间隔等分或者累加格子。当霍夫变换算法开始,每个像素坐标点P(x, y)被转换到(r, theta)的曲线点上面,累加到对应的格子数据点,当一个波峰出现时候,说明有直线存在。
# 通过霍夫变换计算角度
def CalcDegree(srcImage):
midImage = cv2.cvtColor(srcImage, cv2.COLOR_BGR2GRAY)
dstImage = cv2.Canny(midImage, 50, 200, 3)
lineimage = srcImage.copy()
# 通过霍夫变换检测直线
# 第4个参数就是阈值,阈值越大,检测精度越高
lines = cv2.HoughLines(dstImage, 1, np.pi/180, 200)
# 由于图像不同,阈值不好设定,因为阈值设定过高导致无法检测直线,阈值过低直线太多,速度很慢
sum = 0
# 依次画出每条线段
for i in range(len(lines)):
for rho, theta in lines[i]:
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
x1 = int(round(x0 + 1000 * (-b)))
y1 = int(round(y0 + 1000 * a))
x2 = int(round(x0 - 1000 * (-b)))
y2 = int(round(y0 - 1000 * a))
# 只选角度最小的作为旋转角度
sum += theta
cv2.line(lineimage, (x1, y1), (x2, y2), (0, 0, 255), 1, cv2.LINE_AA)
plt.subplot(222),plt.imshow(lineimage)
# 对所有角度求平均,这样做旋转效果会更好
average = sum / len(lines)
angle = DegreeTrans(average) - 90
return angle
对于所画出的所有线条,只选角度最小的作为旋转角度
但是为使矫正效果更好,对所有角度求平均,这样做旋转效果会更好。
3、仿射变换
仿射变换,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。仿射变换是在几何上定义为两个向量空间之间的一个仿射变换或者仿射映射由一个非奇异的线性变换接上一个平移变换组成。
仿射变换直观的叫法可以叫做平面变换或者是二维坐标(x,y)变换。
仿射变换的方程组有6个未知数,所以要求解就需要找到3组映射点,三个点刚好确定一个平面。最后旋转图像进行仿射变换矫正图像
# 逆时针旋转图像degree角度(原尺寸)
def rotateImage(src, degree):
# 旋转中心为图像中心
h, w = src.shape[:2]
# 计算二维旋转的仿射变换矩阵
RotateMatrix = cv2.getRotationMatrix2D((w/2.0, h/2.0), degree, 1)
print(RotateMatrix)
# 仿射变换,背景色填充为白色
rotate = cv2.warpAffine(src, RotateMatrix, (w, h), borderValue=(255, 255, 255))
return rotate
input_img_file = "009.jpg"
image = cv2.imread(input_img_file)
plt.subplot(221),plt.imshow(image)
degree = CalcDegree(image)
#print("调整角度:", degree)
rotate = rotateImage(image, degree)
plt.subplot(223),plt.imshow(rotate)
plt.show
完整代码
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 度数转换
def DegreeTrans(theta):
res = theta / np.pi * 180
return res
# 逆时针旋转图像degree角度(原尺寸)
def rotateImage(src, degree):
# 旋转中心为图像中心
h, w = src.shape[:2]
# 计算二维旋转的仿射变换矩阵
RotateMatrix = cv2.getRotationMatrix2D((w/2.0, h/2.0), degree, 1)
print(RotateMatrix)
# 仿射变换,背景色填充为白色
rotate = cv2.warpAffine(src, RotateMatrix, (w, h), borderValue=(255, 255, 255))
return rotate
# 通过霍夫变换计算角度
def CalcDegree(srcImage):
midImage = cv2.cvtColor(srcImage, cv2.COLOR_BGR2GRAY)
dstImage = cv2.Canny(midImage, 50, 200, 3)
lineimage = srcImage.copy()
# 通过霍夫变换检测直线
# 第4个参数就是阈值,阈值越大,检测精度越高
lines = cv2.HoughLines(dstImage, 1, np.pi/180, 200)
# 由于图像不同,阈值不好设定,因为阈值设定过高导致无法检测直线,阈值过低直线太多,速度很慢
sum = 0
# 依次画出每条线段
for i in range(len(lines)):
for rho, theta in lines[i]:
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
x1 = int(round(x0 + 1000 * (-b)))
y1 = int(round(y0 + 1000 * a))
x2 = int(round(x0 - 1000 * (-b)))
y2 = int(round(y0 - 1000 * a))
# 只选角度最小的作为旋转角度
sum += theta
cv2.line(lineimage, (x1, y1), (x2, y2), (0, 0, 255), 1, cv2.LINE_AA)
plt.subplot(222),plt.imshow(lineimage)
# 对所有角度求平均,这样做旋转效果会更好
average = sum / len(lines)
angle = DegreeTrans(average) - 90
return angle
input_img_file = "003.jpg"
image = cv2.imread(input_img_file)
plt.subplot(221),plt.imshow(image)
degree = CalcDegree(image)
#print("调整角度:", degree)
rotate = rotateImage(image, degree)
plt.subplot(223),plt.imshow(rotate)
plt.show
python直线水平_基于直线勘测水平图像矫正——python相关推荐
- 高中生学python培养思维能力_基于培养思维能力的Python语言程序设计教学
教育信息化 数码世界 P .203 基于培养思维能力的 Python 语言程序设计教学 周蓉 东莞市商业学校 摘要 :Python 语言有着简洁,高效和生态的三大特点,在中职学校引入计算机程序设计 ...
- 嵩天python爬虫百度云盘_基于MOOC嵩天《Python网络爬虫与信息提取》视频学习记录——第一周:requests库...
1.requests库入门 requests的get( )方法 在这里插入图片描述 爬取百度网页实例: import requests r = requests.get("http://ww ...
- Python深度学习:基于PyTorch [Deep Learning with Python and PyTorch]
作者:吴茂贵,郁明敏,杨本法,李涛,张粤磊 著 出版社:机械工业出版社 品牌:机工出版 出版时间:2019-11-01 Python深度学习:基于PyTorch [Deep Learning with ...
- Python灰帽子_黑客与逆向工程师的Python编程之道
收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道
- python 放射 水平_基于Python的放射性核素大气扩散程序初步开发与验证
龙源期刊网 http://www.qikan.com.cn 基于 Python 的放射性核素大气扩散程序初 步开发与验证 作者:刘朋杰,张旖旎,刘天元 来源:<科学与财富> 2018 年第 ...
- python遥感图像处理_基于Python的矿山遥感监测系统开发方法
目前,很多学者都是从宏观上讨论遥感和GIS一体化集成的可能性及集成的方法,但这些研究在GIS和RS方向只是对Python集成研究的思路或某一功能的介绍,并没有一个基于Python开发的集成GIS与RS ...
- minitab怎么算西格玛水平_西格玛和西格玛水平
西格玛和西格玛水平 - Jeff 很多人经常将"西格玛"和"西格玛水平"这两个概念给混淆,在学习六西格玛时,这两个概念必须明确区分开来,并掌握好. 在解释这两个 ...
- python自动化测试开发_基于python的selenium2自动化测试从基础到实战(Python3、selenium2、自动化测试、web测试)...
Selenium2是目前比较流行的一款针对web页面测试的自动化测试工具,他的前身是Selenium .Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozi ...
- 学python可以改善思维_基于培养思维能力的Python语言程序设计教学
周蓉 摘要:Python语言有着简洁,高效和生态的三大特点,在中职学校引入计算机程序设计Python语言课程的教学,可以培养学生解决问题的思维能力,可以面向问题引发兴趣培养思维能力,引导创新.实践表明 ...
最新文章
- 挥手送别 2019,翘首期待 2020
- webassembly类型_WebAssembly 那些事儿
- android8显示广播,关于android8.0静态接收广播
- I/O事件处理模型之Reactor和Proactor 【转】
- 【Python】4500字、10个案例分享几个Python可视化小技巧,助你绘制高质量图表
- c++ array stl_C ++ STL中带有示例的array :: front()函数
- WEB2.0开发平台
- JQuery获取当前屏幕的高度宽度
- 菜鸟从零学编程——GET与POST
- Step7 V5.6 win10版本安装包下载
- C++编程读取注册表文件
- 初级会计资格-初级会计实务-知识点总结大全
- rap技术原理_人们对Rap(说唱)理解的误区,你知道多少?
- LeetCode之报数(简单 模拟 递归)
- 异构数据统一管理推动存储资源盘活
- 利用计算机解决古代数学问题鸡兔同笼,古代人是怎样解决“鸡兔同笼”得问提的?...
- Erase/Trim/Discard/Sanitize 区别详解
- onMouse 鼠标移入移出事件
- Android Native APP开发笔记:文件存储与访问
- 高职高考数学可以用计算机吗,什么学习水平高职高考数学可以答满分