Opencv实现倾斜图片转正示例

yizhihongxing

接下来我将详细讲解如何使用Opencv实现倾斜图片转正的攻略。

1. 实现思路

倾斜图片转正的实现思路是将原图进行旋转,使其与水平方向对齐,然后再对旋转后的图像进行裁剪,裁剪出原图的有效区域。Opencv提供了旋转图片的方法和裁剪图片的方法。

2. 示例1:使用Hough变换检测直线倾斜角度

使用Hough变换检测直线倾斜角度是倾斜图片转正的一种常用方法。具体过程如下:

  1. 读取待处理的图片,并转换为灰度图像。
  2. 使用Canny边缘检测算法对图像进行边缘检测,得到二值图像。
  3. 使用Hough变换检测图像中的直线,可以使用HoughLinesP()函数实现。
  4. 对检测到的直线进行筛选,选出倾斜角度最大的直线。
  5. 计算出倾斜角度,并使用cv2.getRotationMatrix2D()函数获得图像变换矩阵。
  6. 使用cv2.warpAffine()函数对图像进行旋转变换。

示例代码如下:

import cv2
import numpy as np

img = cv2.imread('input.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 50, minLineLength=100, maxLineGap=10)

max_theta = 0
for line in lines:
    x1, y1, x2, y2 = line[0]
    theta = abs(np.arctan2(y2 - y1, x2 - x1) * 180 / np.pi)
    if theta > max_theta:
        max_theta = theta
        max_line = line

h, w = img.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, max_theta, 1.0)
rotated = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
cv2.imwrite('rotated.jpg', rotated)

3. 示例2:使用图像矩计算倾斜角度

使用图像矩计算倾斜角度是另一种常用的倾斜图片转正方法,其主要思路如下:

  1. 读取待处理的图片。
  2. 将图像转为灰度图像,并进行二值化处理。
  3. 对二值图像进行膨胀操作,使图像中的字符更容易连成连通块。
  4. 使用cv2.findContours()函数提取图像中的所有连通块。
  5. 遍历所有连通块,计算每个连通块的图像矩,并根据矩计算出倾斜角度。
  6. 使用cv2.getRotationMatrix2D()函数获得图像变换矩阵。
  7. 使用cv2.warpAffine()函数对图像进行旋转变换。

示例代码如下:

import cv2
import numpy as np

img = cv2.imread('input.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
dilation = cv2.dilate(thresh, kernel, iterations=1)
contours, _ = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

max_theta = 0
for cnt in contours:
    rect = cv2.minAreaRect(cnt)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    x1, y1 = box[0]
    x2, y2 = box[1]
    theta = abs(np.arctan2(y2 - y1, x2 - x1) * 180 / np.pi)
    if theta > max_theta:
        max_theta = theta
        max_box = box

h, w = img.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, max_theta, 1.0)
rotated = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
cv2.imwrite('rotated.jpg', rotated)

经过上述步骤,我们即可实现倾斜图片转正。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Opencv实现倾斜图片转正示例 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • python常用的各种排序算法原理与实现方法小结

    排序算法是计算机科学中的基本问题之一。在Python中,我们可以使用各种排序算法对数据进行排序。以下是Python常用的各种排序算法原理与实现方法的小结。 冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,比较相邻的两个元素,并按照大小交换它们的位置,直到整个列表都是有序的。以下是冒泡排序的Python实现: def bubble_sort(…

    python 2023年5月13日
    00
  • 我似乎无法在 python 中找到前面零的正确格式规范

    【问题标题】:I cannot seem to find the correct formatting spec for preceding zeroes in python我似乎无法在 python 中找到前面零的正确格式规范 【发布时间】:2023-04-02 04:08:01 【问题描述】: 加小数的时候,就这么简单 john = 2 johnmod …

    Python开发 2023年4月8日
    00
  • Python实现的用户登录系统功能示例

    我来给你详细讲解Python实现的用户登录系统功能示例的完整攻略。 1. 系统功能介绍 在我们的用户登录系统中,我们需要实现以下功能: 用户注册:用户输入账号和密码,将其存入数据库中。 用户登录:用户输入账号和密码,系统进行验证,若验证成功则允许用户进入系统。 修改密码:用户可以在登录状态下修改密码。 2. 实现步骤 2.1 安装所需包 我们需要安装以下包来…

    python 2023年5月30日
    00
  • Python中如何处理常见报错

    在Python编程中,我们经常会遇到各种异常报错。这些报错可能是由于代码中的语法错误、数据类型错误、变量或函数未定义、索引超出范围等原因引起的。以下是一些常见Python异常报错及其解决方案: 1. SyntaxError SyntaxError通常是由于代码中语法错误引起的。解决方案是检查代码中的语法错误,并进行修正。 示例1:缺少冒号 # 错误示例 if…

    python 2023年5月13日
    00
  • Python接口自动化浅析数据驱动原理

    Python接口自动化浅析数据驱动原理 在 Python 接口自动化测试中,数据驱动是很重要的一个概念。下面将给出一份完整的攻略,介绍数据驱动的原理以及如何在接口自动化测试中使用数据驱动。 数据驱动原理 数据驱动是一种测试设计方法,它可以帮助我们减少测试用例数量,提高测试覆盖率。采用数据驱动的测试方法,我们只需要对模块进行一次编写,就可以使用多组测试数据进行…

    python 2023年6月3日
    00
  • python接口自动化使用requests库发送http请求

    以下是关于Python接口自动化使用requests库发送HTTP请求的攻略: Python接口自动化使用requests库发送HTTP请求 在Python接口自动化中,使用requests库发送HTTP请求是非常常见的操作。以下是Python接口自动化使用requests库发送HTTP请求的攻略。 发送GET请求 使用requests库发送GET请求非常简…

    python 2023年5月14日
    00
  • PyQt5每天必学之弹出消息框

    我来详细讲解一下“PyQt5每天必学之弹出消息框”的完整攻略。 弹出消息框 弹出消息框是GUI应用程序中一个常见的功能。在PyQt5中,我们可以使用QMessageBox类来实现弹出消息框的效果。QMessageBox提供了几种不同的消息框类型,包括信息框、警告框、错误框等。 下面是一个简单的示例,演示如何弹出一个信息框: from PyQt5.QtWidg…

    python 2023年5月20日
    00
  • python常见模块与用法

    Python 常见模块与用法 Python 作为一门强大的编程语言,在其强大的生态系统中拥有着海量的模块和库,供我们选择。本文将介绍一些 Python 常见的模块与用法及示例代码。 一、math 模块 math 模块提供了许多数学运算功能,包括三角函数、指数函数、对数函数、常数等等。 1.1 三角函数 例: import math print("s…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部