python图像倾斜校正_霍夫变换 文本图片倾斜矫正 python实现

本文介绍了霍夫变换的基本原理,将直线检测问题转化为计算峰值问题。通过Python的OpenCV库,展示了如何应用霍夫变换检测图像中的直线,计算倾斜角度并进行图像旋转矫正,提供了一个具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、霍夫变换原理简介

霍夫变换主要是利用图片所在的空间和霍夫空间之间的变换,将图片所在的直角坐标系中具有形状的曲线或直线映射到霍夫空间的一个点上形成峰值,从而将检测任意形状的问题转化成了计算峰值的问题。即在图片所在的直角坐标系的一个直线,转换到霍夫空间便成了一点,并且是由多条直线相交而成,我们统计的峰值也就是该相交点的橡胶线的条数

这么难以理解,下面将用霍夫直线检测具体解释一下为什么可以将检测任意形状问题转化成计算峰值问题

对图片建立直角坐标系,则图片中如果存在一条直线,设为:y = kx + b,此空间x、y 为未知数,k、b是参数; 而霍夫空间便是将k、b看成未知数,x、y看成参数,因此霍夫空间便是 b = -xk + y

如果图片中有一条长的直线:y = kx + b*,那么肯定由很多个像素点(x0, y0)构成,但k、b是固定的,将这条直线上的像素点全部映射到霍夫空间中,(k, b)是一个固定的点,但(x0, y0)不同,所以在霍夫空间中便形成了多条直线汇聚于一点。如下图:

image

因此得出结论: 我们便是在霍夫空间中统计多个(k、b),对每一个(k, b)上的直线条数进行统计,计算出峰值最高的那个,也就是在图片所在直角坐标系中我们要检测的直线。此时在回看最初那句话应该更理解了。

二、python霍夫变化实现文本图片倾斜矫正

先上图:

image

image

python实现

#先通过hough transform检测图片中的图片,计算直线的倾斜角度并实现对图片的旋转

import os

import cv2

import math

import random

imp

### 使用霍夫变换实现文本倾斜校正 在处理文档图像时,为了提高OCR识别精度和其他后续操作的效果,通常需要先对输入图像进行预处理。其中一个重要环节就是纠正由于拍摄角度或其他原因造成的文本区域倾斜问题。 对于这一过程,在给定的描述中提到,会利用到一系列计算机视觉技术来完成这项工作[^1]。具体来说: - **图像读取与初步处理** 需要加载待矫正的目标图片,并将其颜色空间由RGB转为单通道灰度图表示形式;这一步骤有助于减少数据量的同时也方便之后的操作。 - **特征增强** 应用了高斯滤波器去除噪声干扰以及Canny算子检测边缘轮廓,从而更好地突出目标对象——即可能存在的直线结构。 - **线段提取** 基于上述准备好的化边缘映射,采用霍夫标准变换算法搜索符合条件(如长度超过一定限度)的所有潜在直线条目。这里特别关注那些接近垂直方向和平行于X轴延伸出来的候选者们。 - **几何关系分析** 计算了所选直线之间的交叉位置作为未来构建四边形顶点的基础依据。理想情况下,应该能够获得正好位于矩形四个角落处的关键坐标集合。 - **视角调整** 创建一张空白画布用来承载最终输出版本的内容。同时借助OpenCV库提供的`getPerspectiveTransform()`函数求解源域至目的域间的投影变化参数矩阵M。 - **执行变形转换** 利用得到的结果作用于原始素材之上实施仿射变换,使得原本歪斜的文字排列变得整齐有序。最后再把修正完毕的新图形展示出来供用户查看或进一步编辑保存。 下面给出一段Python脚本示范了整个流程的实际编码方式: ```python import cv2 import numpy as np def find_corners(edges): lines = cv2.HoughLinesP( edges, rho=1, theta=np.pi / 180, threshold=100, minLineLength=100, maxLineGap=10) horizontal_lines = [] vertical_lines = [] for line in lines: x1, y1, x2, y2 = line[0] if abs(y2 - y1) < abs(x2 - x1): # Horizontal Line horizontal_lines.append(line) elif abs(x2 - x1) < abs(y2 - y1): # Vertical Line vertical_lines.append(line) intersections = [] # Calculate intersection points between all pairs of h/v lines. for hl in horizontal_lines: for vl in vertical_lines: px, py, qx, qy = hl[0] rx, ry, sx, sy = vl[0] det = (qx - px)*(sy - ry)-(qy-py)*(sx-rx) if det != 0: # Check parallelism t = ((px - rx)*(sy - ry) - (py - ry)*(sx - rx)) / det u = -((px - qx)*(py - ry) - (py-qy)*(px-rx))/det if 0<=t<=1 and 0<=u<=1: ix = int(px+t*(qx-px)) iy = int(py+t*(qy-py)) intersections.append([ix,iy]) corners = sorted(intersections,key=lambda p:(p[0],p[1])) return np.array(corners[:4]) img = cv2.imread('skewed_image.jpg') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray,(5,5),sigmaX=0) edges = cv2.Canny(blurred,threshold1=50,threshold2=150) corners = find_corners(edges) pts_src = np.float32([[0,0],[img.shape[1]-1 ,0], [0,img.shape[0]-1 ],[img.shape[1]-1 ,img.shape[0]-1 ]]) matrix = cv2.getPerspectiveTransform(np.float32(corners), pts_src ) result = cv2.warpPerspective(img,matrix,dsize=(img.shape[1], img.shape[0])) cv2.imwrite("deskewed_image.jpg", result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值