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中执行SQLite数据库的查询语句?

    在Python中,我们可以使用sqlite3库执行SQLite数据库的查询语句。以下是如何在Python中执行SQLite数据库的查询语句的完整使用攻略,包括连接数据库、创建游标、执行语句等步骤。同时提供了两个示例以便更好理解如何在Python中执行SQLite数据库的查询语句。 步骤1:安装sqlite3库 在Python中,我们可以使用sqlite3库连…

    python 2023年5月12日
    00
  • python创建学生成绩管理系统

    下面是详细讲解“Python创建学生成绩管理系统”的完整攻略。 1. 确定需求和功能 在创建学生成绩管理系统前,需要先确定需求和功能。 基本需求:- 可以输入学生信息和成绩- 可以查看学生信息和成绩- 可以删除学生信息和成绩- 可以修改学生信息和成绩- 可以根据成绩进行排序 进阶需求:- 可以导出学生信息和成绩 2. 设计数据结构 本系统的数据结构是由学生信…

    python 2023年5月30日
    00
  • python对象转字典的两种实现方式示例

    下面我将为你讲解“Python对象转字典的两种实现方式示例”的完整攻略。 Python对象转字典的两种实现方式 在Python中,有时候我们需要将一个对象转换成一个字典,以方便后续的处理。常见的用途包括: 将一个类实例转换成一个字典,以便存储或传输。 将一个JSON对象转换成一个Python字典,以便对其进行进一步的处理。 下面我将介绍如何实现Python对…

    python 2023年5月13日
    00
  • python3爬虫之入门基础和正则表达式

    Python3 爬虫之入门基础和正则表达式 什么是爬虫? 爬虫,也称网络爬虫,是指一种自动获取网页内容的程序。爬虫通常会通过模拟人工浏览网页的行为,去抓取网页中的数据。 为什么要学习爬虫? 学习爬虫可以帮助我们: 更好地了解数据,掌握数据分析的技能; 在互联网中获取到自己需要的信息,并进行分析,以用于各种应用场景; 搜集市场上的报价、行情、新闻等信息,帮助决…

    python 2023年5月14日
    00
  • Python中sub()的用法说明

    以下是详细讲解“Python中sub()的用法说明”的完整攻略,包括sub()函数的介绍、参数说明、示例说明和注意事项。 sub()函数的介绍 在Python中sub()函数是re模块中的一个函数,用于替换字符串中则表达式匹配的子串。sub()函数的语法如下: re.sub(pattern, repl, string, count=0, flags=0) 其…

    python 2023年5月14日
    00
  • 【manim动画教程】–相机

    相机(Camera)在二维的场景下使用不多,一般在3D场景中提及的比较多。相机相当于我们看动画的视角,简单来理解的话,相当于我们的眼睛(实际情况会复杂一些,相机还有其他一些辅助功能)。 默认的相机焦点在屏幕的中心位置,相机默认是以俯视的视角查看所有的元素。之前的介绍的常用动画效果和高级动画效果,都没有对相机进行调整过,所以,是通过移动和变换各个元素来实现动画…

    python 2023年4月19日
    00
  • python 进程间数据共享multiProcess.Manger实现解析

    下面我将详细讲解“Python进程间数据共享multiProcess.Manager实现解析”的完整攻略。 什么是进程间数据共享? 在并发编程中,进程间数据的共享是必不可少的一个环节。因为不同进程之间是互相独立的,如果不进行数据共享,则各个进程之间无法进行数据交互,从而无法实现并发编程的效果。 Python中的进程间数据共享 在Python中,可以使用mul…

    python 2023年5月13日
    00
  • 详解Python中的Dict(下篇)

    下面是关于“详解Python中的Dict(下篇)”的完整攻略。 1. Dict的常用方法和操作 1.1. 获取字典中的值 我们可以通过键(key)获取字典中对应的值(value),示例如下: fruits = {‘apple’: 3, ‘banana’: 5, ‘orange’: 2} print(fruits[‘banana’]) # 输出 5 如果键不存…

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