Opencv实现倾斜图片转正示例

接下来我将详细讲解如何使用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中常用的字符串连接方法,并提供一些示例说明。 1. “+”操作符 使用“+”操作符可以将两个字符串连接成一个新字符串。该操作符可以同时连接两个字符串,也可以连接多个字符串。 示例代码如下: str1 = "…

    python 2023年6月7日
    00
  • Python数据可视化 pyecharts实现各种统计图表过程详解

    Python数据可视化pyecharts实现各种统计图表过程详解 数据可视化是数据分析中非常重要的一部分,它可以帮助我们更好地理解和分析数据。Python提供了一些强大的数据可视化工具,其中pyecharts是一个非常流行的工具,它可以帮助我们轻松地创建各种统计图表。本文将详细讲解如何使用pyecharts实现各种统计图表。 安装pyecharts 在使用p…

    python 2023年5月15日
    00
  • 如何在Python中查询Redis数据库中的数据?

    以下是在Python中查询Redis数据库中的数据的完整使用攻略。 使用Redis数据库的前提条件 在使用Python连接Redis数据库之前,需要确保已经安装Redis数据库,并已经创建使用的数据库,同时需要安装Python的驱动程序,例如redis。 步骤1:导入模块 在Python中使用redis模块连接Redis数据库。以下是导入redis模块的基本…

    python 2023年5月12日
    00
  • Python Matplotlib通过plt.subplots创建子绘图

    下面是Python Matplotlib通过plt.subplots创建子绘图的完整攻略。 1. Matplotlib简介 Matplotlib是一个Python数据可视化库,用于创建图形和图形界面。Matplotlib提供了大量的绘图工具和选项,可以创建各种类型的图形,包括折线图、散点图、直方图、条形图、饼图等等。 2. plt.subplots()函数 …

    python 2023年5月14日
    00
  • Python读取视频的两种方法(imageio和cv2)

    Python读取视频有很多方法,其中比较常用的两种方法分别是:imageio和cv2。下面将分别详细讲解这两种方法的使用步骤和示例代码。 一、使用imageio读取视频 1. 安装imageio 使用pip命令安装imageio: pip install imageio 2. 读取视频文件 读取视频文件需要用到imageio的imread函数。示例代码如下:…

    python 2023年5月18日
    00
  • python中 ? : 三元表达式的使用介绍

    那么让我们来详细讲解一下“python中 ? : 三元表达式的使用介绍”。 什么是三元表达式 在Python中,“?:”这个操作符并不存在,但是可以使用三元表达式来模拟其使用,三元表达式指的是一个三目运算符的简写形式,其基本语法如下: expression1 if condition else expression2 其中,condition是一个True/…

    python 2023年5月19日
    00
  • 详解Python中的类方法与静态方法

    接下来我来详细讲解Python中的类方法与静态方法。 类方法和静态方法的定义 在Python中,我们可以使用@classmethod装饰器来定义类方法,使用@staticmethod装饰器来定义静态方法。定义类方法和静态方法的语法如下所示: class MyClass: @classmethod def class_method(cls, arg1, arg…

    python-answer 2023年3月25日
    00
  • python进行OpenCV实战之画图(直线、矩形、圆形)

    那么首先我们来介绍一下 OpenCV 和 Python 在画图方面的基础知识。 OpenCV 和 Python 实现画图 OpenCV 是一种计算机视觉领域常用的开源计算机视觉库,它可以在视觉识别、人脸识别等各种相关图像处理领域中起到重要的作用,并且它的功能非常强大。Python 作为一种解释型语言,也已经成为了数据分析、人工智能领域中非常重要的工具之一,而…

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