python opencv实现图像矫正功能

 更新时间:2022年08月01日 09:58:58   作者:DanCheng-studio  
这篇文章主要为大家详细介绍了python opencv实现图像矫正功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了python opencv实现图像矫正的具体代码,供大家参考,具体内容如下

问题简介

一般的我们对图像中的目标进行分析和检测时,往往目标具有一定的倾斜角度,自然环境中正面向我们的目标实际是很少的,那将这些倾斜的目标“扶正”的过程就就叫做图像矫正。

透视变换demo

图像矫正使用的主要技术是透视变换。
python-opencv 透视变换demo如下:

import cv2
import numpy as np

img = cv2.imread('/home/pzs/图片/1.jpeg')

result3 = img.copy()

img = cv2.GaussianBlur(img,(3,3),0)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

edges = cv2.Canny(gray,50,150,apertureSize = 3)
cv2.imwrite("canny.jpg", edges)

src = np.float32([[207, 151], [517, 285], [17, 601], [343, 731]])
dst = np.float32([[0, 0], [337, 0], [0, 488], [337, 488]])
m = cv2.getPerspectiveTransform(src, dst)
result = cv2.warpPerspective(result3, m, (337, 488))
cv2.imshow("result", result)
cv2.waitKey(0)

主要是使用cv2.warpPerspective()函数

透视变换结果

透视变换使用很简单,关键是如何找到目标的4个顶点。

如何找到目标的4个顶点

如何找到这4个顶点:
方法有很多种,如:直线检测,轮廓检测,最小外接矩形等。

使用轮廓检测方式:

import cv2
import imutils

img = cv2.imread('1.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
dilate = cv2.dilate(blurred, cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)))
edged = cv2.Canny(dilate, 30, 120, 3)            # 边缘检测

cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  # 轮廓检测
cnts = cnts[0] if imutils.is_cv2() else cnts[1]  # 判断是opencv2还是opencv3
docCnt = None

if len(cnts) > 0:
    cnts = sorted(cnts, key=cv2.contourArea, reverse=True) # 根据轮廓面积从大到小排序
    for c in cnts:
        peri = cv2.arcLength(c, True)                                       # 计算轮廓周长
        approx = cv2.approxPolyDP(c, 0.02*peri, True)           # 轮廓多边形拟合
        # 轮廓为4个点表示找到纸张
        if len(approx) == 4:
            docCnt = approx
            break

for peak in docCnt:
    peak = peak[0]
    cv2.circle(img, tuple(peak), 10, (255, 0, 0))

cv2.imshow('img', img)
cv2.waitKey(0)

原理:

1、对图片进行轮廓检测
2、对检测出的轮廓进行多边形逼近
3、多边形为四边形且轮廓面积最大的图形为纸张
4、输出标记四个定点

cv2.approxPolyDP() 多边形逼近

重点讲解这个函数

作用:

对目标图像进行近似多边形拟合,使用一个较少顶点的多边形去拟合一个曲线轮廓,要求拟合曲线与实际轮廓曲线的距离小于某一阀值。

函数原形:

cv2.approxPolyDP(curve, epsilon, closed) -> approxCurve

参数:

curve : 图像轮廓点集,一般由轮廓检测得到
epsilon : 原始曲线与近似曲线的最大距离,参数越小,两直线越接近
closed : 得到的近似曲线是否封闭,一般为True

返回值:

approxCurve :返回的拟合后的多边形顶点集。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • python银行卡号码校验Luhn模10算法

    python银行卡号码校验Luhn模10算法

    这篇文章主要为大家介绍了python银行卡号码校验Luhn模10算法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 一文详解如何使用Python从字符串中提取数字

    一文详解如何使用Python从字符串中提取数字

    这篇文章主要给大家介绍了关于如何使用Python从字符串中提取数字的相关资料,我们在进行数据处理时候,可能想要提取字符串中的数字进行分析,需要的朋友可以参考下
    2023-11-11
  • python  Django中的apps.py的目的是什么

    python Django中的apps.py的目的是什么

    这篇文章主要介绍了python Django中的apps.py的目的是什么,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2018-10-10
  • Python使用JSON库解析JSON数据的方法

    Python使用JSON库解析JSON数据的方法

    这篇文章主要介绍了Python使用JSON库解析JSON数据,主要包括如何在网页中获取json数据及python内置的json库,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • matplotlib 纵坐标轴显示数据值的实例

    matplotlib 纵坐标轴显示数据值的实例

    今天小编就为大家分享一篇matplotlib 纵坐标轴显示数据值的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 如何理解python中数字列表

    如何理解python中数字列表

    在本篇文章里小编给大家分享的是关于python中数字列表知识点详解,有兴趣的朋友们可以参考下。
    2020-05-05
  • 详解用selenium来下载小姐姐图片并保存

    详解用selenium来下载小姐姐图片并保存

    这篇文章主要介绍了详解用selenium来下载小姐姐图片并保存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Python装饰器入门学习教程(九步学习)

    Python装饰器入门学习教程(九步学习)

    装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。本文给大家介绍Python装饰器入门学习教程(九步学习),对python装饰器相关知识感兴趣的朋友一起学习吧
    2016-01-01
  • Python读取properties配置文件操作示例

    Python读取properties配置文件操作示例

    这篇文章主要介绍了Python读取properties配置文件操作,结合实例形式分析了Python读取properties配置文件操作中增加对键值对支持与使用的相关技巧,需要的朋友可以参考下
    2018-03-03
  • Python利用pyHook实现监听用户鼠标与键盘事件

    Python利用pyHook实现监听用户鼠标与键盘事件

    这篇文章主要介绍了Python利用pyHook实现监听用户鼠标与键盘事件,很有实用价值的一个技巧,需要的朋友可以参考下
    2014-08-08

最新评论