Python中opencv的一些函数及应用

news2024/12/16 5:10:18

Sobel 算子函数

功能: Sobel 算子用于计算图像的梯度(变化率),常用于边缘检测。它通过对图像应用一个基于一阶导数的滤波器来强调图像中的边缘部分,特别是水平和垂直方向上的边缘。通过计算图像的梯度,可以获得图像中亮度变化较大的地方,这些地方通常是物体的边界。

Sobel 算子有两个方向的变体:

  • Sobel X:计算水平方向的梯度。
  • Sobel Y:计算垂直方向的梯度。

Sobel 算子函数:cv2.Sobel()

函数原型

cv2.Sobel(src, ddepth, dx, dy, ksize=3, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT)

参数

  1. src (InputArray):

    • 输入图像,必须是灰度图像(单通道),通常是 uint8float32 类型。
  2. ddepth (int):

    • 输出图像的深度(数据类型)。通常选择:
      • cv2.CV_8U:8位无符号整数(用于图像显示)。
      • cv2.CV_32F:32位浮动点(用于更高精度的计算)。
      • cv2.CV_64F:64位浮动点(高精度计算)。
  3. dx (int):

    • x方向的导数阶数。
    • dx=1 表示计算水平方向的梯度,dx=0 表示不计算水平方向的导数。
  4. dy (int):

    • y方向的导数阶数。

    • dy=1 表示计算垂直方向的梯度,dy=0 表示不计算垂直方向的导数。

返回值

  • 返回与输入图像大小相同的图像,表示计算得到的梯度图。其每个像素值代表在该位置的梯度强度。
import cv2

img = cv2.imread("shudu.png")

img_sobel = cv2.Sobel(img, -1, 0,1, ksize=3)

img_sobel2 = cv2.Sobel(img, -1, 1,0, ksize=3)

cv2.imshow("img", img)
cv2.imshow("img_sobel", img_sobel)
cv2.imshow("img_sobel2", img_sobel2)
cv2.waitKey(0)

Laplacian 算子函数

功能: Laplacian 算子用于图像的二阶导数处理,能够检测图像中的边缘和细节,尤其是图像亮度变化非常显著的地方。它是基于图像的二阶导数,能够揭示图像中变化急剧的区域(例如,边缘和纹理)。

与 Sobel 算子主要处理图像一阶导数的不同,Laplacian 算子通过计算图像的二阶导数来增强边缘信息,特别适用于检测图像中亮度变化较大的部分。

Laplacian 算子可以用来:

  1. 检测边缘:通过高亮变化剧烈的区域(边缘)来找到图像的结构。
  2. 增强细节:增强图像中的细节部分,尤其是图像对比度较低的地方。
  3. 图像预处理:通常用于后续的图像分析,如分割、特征提取等。

Laplacian 算子函数:cv2.Laplacian()

函数原型

cv2.Laplacian(src, ddepth, ksize=3, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT)

参数

  1. src (InputArray):

    • 输入图像,必须是灰度图像(单通道),通常是 uint8float32 类型。彩色图像需要先转换为灰度图像。
  2. ddepth (int):

    • 输出图像的深度(数据类型)。常用的选项包括:
      • cv2.CV_8U:8位无符号整数(用于图像显示)。
      • cv2.CV_32F:32位浮动点(用于精确计算)。
      • cv2.CV_64F:64位浮动点(用于高精度计算)。
  3. ksize (int, 可选):

    • 卷积核的大小。常用值为 1、3、5、7 等,默认是 3。较大的核大小可以捕捉到更大的变化,但可能导致图像模糊。

返回值

  • 返回与输入图像大小相同的图像,表示图像的 Laplacian 变换结果。输出图像反映了图像的二阶导数信息,边缘部分的像素值较大,而平坦区域的像素值较小。
import cv2

img = cv2.imread("shudu.png")

img_lap = cv2.Laplacian(img, -1, ksize=3)

cv2.imshow("img", img)
cv2.imshow("img_lap", img_lap)
cv2.waitKey(0)

 

Canny 算子函数

功能: Canny 算子是图像处理中经典的边缘检测算法,由 John F. Canny 于1986年提出。它基于多阶段的处理流程,旨在通过检测图像中亮度急剧变化的区域来提取边缘。Canny 算子通常用于:

  • 提取图像中的边缘。
  • 去除噪声并减少误检。
  • 提高图像分析和识别的准确性。

Canny 算子包括以下主要步骤:

  1. 高斯滤波:使用高斯滤波器对图像进行平滑处理,去除噪声。
  2. 梯度计算:计算图像在水平方向(X)和垂直方向(Y)的梯度,通常使用 Sobel 算子。
  3. 非极大值抑制(NMS):在梯度图像中找到边缘,并通过抑制非边缘点来细化边缘。
  4. 双阈值检测:根据设定的低阈值和高阈值对梯度值进行分类,确定边缘的强度。
  5. 边缘连接:使用边缘连接算法,确保边缘被正确地连接起来。

Canny 算子函数:cv2.Canny()

函数原型

cv2.Canny(image, threshold1, threshold2, edges=None, apertureSize=3, L2gradient=False)

参数

  1. image (InputArray):

    • 输入图像,必须是灰度图像。若输入为彩色图像,函数会自动转换为灰度图像。
  2. threshold1 (int):

    • 低阈值。图像中的梯度值低于该值的像素点将被认为不是边缘。用于初步筛选边缘像素。
  3. threshold2 (int):

    • 高阈值。图像中的梯度值高于该值的像素点将被认为是边缘。用于确定强边缘像素。

返回值

  • 返回一个二值图像,表示图像中的边缘。边缘的像素值为 255(白色),非边缘的像素值为 0(黑色)。边缘图像与输入图像具有相同的大小。
import cv2

img = cv2.imread("flower.png")

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度化

_, img_bin = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)  # 二值化

img_blur = cv2.GaussianBlur(img_bin, (3, 3), 3)  # 高斯模糊

img_canny = cv2.Canny(img_blur, 30, 70)  # 边缘检测

cv2.imshow("img", img)

cv2.imshow("img_canny", img_canny)
cv2.waitKey(0)

 

 findContours 函数 和 drawContours 函数

findcontours()

功能cv2.findContours() 函数是 OpenCV 中用于图像轮廓检测的函数,它可以检测图像中的轮廓(即边界或物体的外形)。通过该函数,可以将图像中的物体或结构提取为一系列的轮廓,通常用于图像分析、形状识别、图像分割等任务。

轮廓是指图像中像素的边界,在二值化图像中,通常白色区域的边界就是轮廓。该函数可以帮助识别这些边界,进而提取对象的形状或进行进一步处理。

findContours 函数:cv2.findContours()

函数原型

cv2.findContours(image, mode, method, contours=None, hierarchy=None)

参数

  1. image (InputArray):

    • 输入图像,必须是二值化图像(黑白图像),可以是 uint8 类型。轮廓检测通常在二值图像中进行,通常首先使用阈值化或边缘检测(如 Canny)方法将图像转换为二值图像。
  2. mode (int):

    • 轮廓的检索模式。决定了如何存储轮廓信息。常用的模式有:
      • cv2.RETR_EXTERNAL:仅检索最外层的轮廓,不考虑内嵌的轮廓。
      • cv2.RETR_LIST:检索所有轮廓,并将它们放在列表中(不建立层级关系)。
      • cv2.RETR_TREE:检索所有轮廓,并建立轮廓的层级关系(即父子关系)。
      • cv2.RETR_CCOMP:检索所有轮廓,返回双层结构(外轮廓与内轮廓)。
      • cv2.RETR_FLOODFILL:检索所有轮廓,并支持 Flood Fill(洪水填充)结构。
  3. method (int):

    • 轮廓的近似方法。决定如何近似轮廓的形状。常用方法有:
      • cv2.CHAIN_APPROX_SIMPLE:存储轮廓的端点,减少存储点的数量。适用于大多数应用。
      • cv2.CHAIN_APPROX_NONE:保存轮廓的所有点(无压缩),适用于需要所有点的应用。

返回值

cv2.findContours() 返回一个包含两个或三个元素的元组:

  1. contours
    • 检测到的轮廓列表。每个轮廓是一个由轮廓点构成的数组,表示轮廓的形状。
  2. hierarchy(可选):
    • 轮廓的层级结构信息,表示轮廓之间的嵌套关系。通常是一个 numpy 数组,包含每个轮廓的父子层级、同级关系等。

 drawContours()

功能cv2.drawContours() 函数用于在图像上绘制轮廓。它可以根据提取到的轮廓信息,将轮廓绘制到图像上,通常用于视觉展示或进一步分析。此函数可以绘制一个或多个轮廓,支持自定义颜色、线条厚度、轮廓层级等。

drawContours 函数:cv2.drawContours()

函数原型

cv2.drawContours(image, contours, contourIdx, color, thickness, lineType=cv2.LINE_8, hierarchy=None, maxLevel=0, offset=(0, 0))

参数: 

  • image (InputOutputArray):

    • 输入图像,可以是彩色图像(例如:BGR图像)或灰度图像。该图像会在绘制轮廓的基础上进行修改,因此如果不希望修改原图,建议先复制图像。
  • contours (list):

    • 轮廓的列表,每个轮廓是一个包含多个点的数组。轮廓是由 cv2.findContours() 函数提取的,可以是一个或多个轮廓。每个轮廓是一个包含边界点(如 [[x1, y1], [x2, y2], ...])的 NumPy 数组。
  • contourIdx (int):

    • 需要绘制的轮廓索引。如果为 -1,表示绘制所有的轮廓。如果要绘制特定轮廓,只需指定其索引值(例如 0 表示第一个轮廓,1 表示第二个轮廓等)。
  • color (Scalar):

    • 轮廓的颜色。可以是一个三元组(如 BGRRGB)。例如, (0, 255, 0) 表示绿色(BGR格式),(255, 0, 0) 表示蓝色。颜色值可以是整型或浮点型。
  • thickness (int):

    • 轮廓的线条厚度。正整数表示线条宽度,-1 表示填充轮廓区域。如果是负值,轮廓区域会被填充(例如:-1 表示填充整个轮廓)

返回值

  • 此函数没有返回值,它直接修改传入的图像(即在图像上绘制轮廓)。因此,绘制轮廓后,通常会显示或保存修改后的图像。
import cv2

img = cv2.imread('../12.13/outline.png')


gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度化
ret,img_binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) #二值化

contour,hierarchy = cv2.findContours(img_binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) #轮廓检测

img_copy=img.copy() #复制图像
img_draw =cv2.drawContours(img_copy,contour,-1,(0,0,255),3) #绘制轮廓

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

 

透视变换函数:cv2.getPerspectiveTransform()cv2.warpPerspective() 

在计算机视觉中,透视变换(Perspective Transformation)用于将图像从一个视角变换到另一个视角。它广泛应用于图像矫正、图像配准、图像拼接等任务。

OpenCV 提供了两个主要函数用于透视变换:

  1. cv2.getPerspectiveTransform():计算透视变换矩阵。
  2. cv2.warpPerspective():应用透视变换矩阵对图像进行变换。

1. cv2.getPerspectiveTransform() 函数

功能

cv2.getPerspectiveTransform() 函数用于计算透视变换矩阵,该矩阵可以将图像中的四个点映射到目标图像中的四个点。它通过原图中的四个点和目标图中的四个点来计算变换矩阵。

函数原型

cv2.getPerspectiveTransform(src, dst)

参数

  • src (numpy.ndarray):
    • 原始图像中的四个点坐标,通常是一个形状为 (4, 2) 的数组,表示图像中四个点的坐标。格式为 [x1, y1], [x2, y2], [x3, y3], [x4, y4],通常是一个矩形或四边形的四个顶点。
  • dst (numpy.ndarray):
    • 目标图像中的四个点坐标,表示变换后图像中四个点的坐标。同样是一个形状为 (4, 2) 的数组。

返回值

  • M (numpy.ndarray):
    • 透视变换矩阵,是一个 3x3 的矩阵,用于将原始图像的四个点映射到目标图像的四个点。

应用

  • cv2.getPerspectiveTransform() 用于计算从一个视角到另一个视角的透视变换矩阵。常用于图像矫正、变换、拼接等任务。

2. cv2.warpPerspective() 函数

功能

cv2.warpPerspective() 函数使用 cv2.getPerspectiveTransform() 计算出的透视变换矩阵来实际执行图像的透视变换。它将图像的像素根据透视矩阵进行重新映射,得到变换后的图像。

函数原型

cv2.warpPerspective(src, M, dsize)

参数

  • src (numpy.ndarray):

    • 输入图像,即要进行透视变换的原始图像。
  • M (numpy.ndarray):

    • 透视变换矩阵,通常通过 cv2.getPerspectiveTransform() 计算得到。
  • dsize (tuple):

    • 输出图像的大小,指定变换后图像的宽和高。通常是 (width, height)

返回值

  • dst (numpy.ndarray):
    • 变换后的图像。输出图像的尺寸由 dsize 参数指定,并且图像的内容会根据透视变换矩阵进行重新映射。

应用

  • cv2.warpPerspective() 用于对图像应用透视变换,常见的应用包括图像的视角变换、平面图形的变换(如棋盘格角度调整)、透视校正等

 

import cv2
import numpy as np

img = cv2.imread('./youhua.png')
points1 = np.float32([[175,142],[621,35],[89,491],[652,546]])

points2 = np.float32([[min(points1[:,0]),min(points1[:,1])],
                      [max(points1[:,0]),min(points1[:,1])],
                      [min(points1[:,0]),max(points1[:,1])],
                      [max(points1[:,0]),max(points1[:,1])]
                       ])
M = cv2.getPerspectiveTransform(points1,points2)

img_output = cv2.warpPerspective(img,M,(img.shape[1],img.shape[0]))

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【docker】springboot 服务提交至docker

准备docker (不是docker hub或者harbor,就是可以运行docker run的服务),首先确保docker已经安装。 本文以linux下举例说明: systemctl stats docker ● docker.service - Docker Application Container EngineLoaded…

XDOJ 877 图的深度优先遍历

题目:图的深度优先遍历 问题描述 已知无向图的邻接矩阵,以该矩阵为基础,给出深度优先搜索遍历序列,并且给出该无向图的连通分量的个数。在遍历时,当有多个点可选时,优先选择编号小的顶点。(即…

大屏开源项目go-view二次开发1----环境搭建(C#)

最近公司要求做一个大屏的程序用于展示公司的产品,我以前也没有相关的经验,最糟糕的是公司没有UI设计的人员,领导就一句话要展示公司的产品,具体展示的内容细节也不知道,全凭借自己发挥。刚开始做时是用wpf做的&#x…

摆脱B端UI框架的桎梏,首先从布局开始

在 B 端开发中,UI 框架虽带来便利,但也可能形成桎梏。要摆脱这种束缚,首先从布局着手是个明智之举。传统的 B 端 UI 框架布局可能较为固定,缺乏灵活性。我们可以尝试创新的布局方式,如响应式设计,适应不同屏…

认识异常吧

在 Java 中,将程序执行过程中发生的不正常行为称为异常 。 异常的体系结构 1. Throwable : 是异常体系的顶层类,其派生出两个重要的子类 , Error(错误) 和 Exception(异常) 2. Error &…

Repo管理

文章目录 前言Repo介绍清单仓库清单仓库的组成 初始化Repo同步远程仓库Repo实际应用 前言 我们知道,Git是用来管理某一个仓库,那当一个项目用到了多个仓库时,怎么来同步管理这些仓库呢?这个时候就可以引入Repo管理。 Repo介绍 …

Spring Security6.3 自定义AuthorizationManager问题

项目环境: Springboot3.3.5, 对应的SpringFrameWork6.1,Security为6.3 问题:我想自定义AuthorizationManager接口实现类,在里面判断如果角色为amdin则放行请求; 在AdminAuthorizationManager类的check()方法中pass变量…

十二月第三周python

import tkinter as tk #安装图形窗口工具 import cv2 #处理视频工具 from tkinter import * #安装图形窗口工具 from PIL import Image, ImageTk#处理图形工具 roottk.Tk() #给工具起名字 root.title("子豪")#软件左上角名字 root.geometry("800x800500100&…

玉米叶病预测数据集,使用yolo,coco,voc格式人工标注,10046张原始图片,可识别叶枯病,普通锈病,灰叶斑病,健康的玉米叶

玉米叶病预测数据集,使用yolo,coco,voc格式人工标注,10046张原始图片,可识别叶枯病,普通锈病,灰叶斑病,健康的玉米叶 数据集分割 训练组87% 8790图片 有效集4% 419图片…

NAT网络地址转化技术

1.什么是NAT NAT技术是一种将自己内网的多个私有IP地址转换为一个公网IP进行访问互联网的一项技术,这个技术主要是用来解决IPv4地址不够的问题。 2.NAT技术的具体例子 如果我们用手机使用流量浏览一个网站,那么第一步手机会对这个域名进行DNS解析&#…

使用DuckDB 加载和清洗数据

DuckDB CLI是允许用户直接从命令行与DuckDB交互的工具。前文你看到了如何使用Python与DuckDB交互。但是,有时你只是想直接使用数据库—例如在创建新表、从不同数据源导入数据以及执行与数据库相关的任务时。在这种情况下,直接使用DuckDB CLI要有效得多。…

linux部署ansible自动化运维

ansible自动化运维 1,编写ansible的仓库(比赛已经安装,无需关注) 1、虚拟机右击---设置---添加---CD/DVD驱动器---完成---确定 2、将ansible.iso的光盘连接上(右下角呈绿色状态) 3、查看光盘挂载信息 df -h…

vue3-tp8-Element:对话框实现

效果 参考框架 Dialog 对话框 | Element Plus 具体实现 一、建立view页面 /src/views/TestView.vue 二、将路径写入路由 /src/router/index.js import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vueconst router create…

YOLOv11改进,YOLOv11添加DLKA-Attention可变形大核注意力,WACV2024 ,二次创新C3k2结构

摘要 作者引入了一种称为可变形大核注意力 (D-LKA Attention) 的新方法来增强医学图像分割。这种方法使用大型卷积内核有效地捕获体积上下文,避免了过多的计算需求。D-LKA Attention 还受益于可变形卷积,以适应不同的数据模式。 理论介绍 大核卷积(Large Kernel Convolu…

Python数据分析案例67——因子分析回归分析

背景 线性回归,主成分回归都做烂了,我之前的案例有很多这些模型,但是一直没写因子分析的回归案例,这个也是传统统计学流行的方法,在金融经济心理学等人文社科用得非常多。这个案例就演示一下python怎么做因子分析。 数…

FastAPI简介

FastAPI简介 一、FastAPI简介二、FastAPI安装2.1 使用pip安装FastAPI2.2 FastAPI的demo2.3 FastAPI的程序结构 三、装饰器请求方法四、用户请求4.1 路径参数4.1.1 单个路径参数4.1.2 多个路径参数4.1.3 固定路径和路径参数的冲突 4.2 查询参数4.3 默认参数4.4 可选参数 五、请求…

Django结合websocket实现分组的多人聊天

其他地方和上一篇大致相同,上一篇地址点击进入, 改动点1:在setting.py中最后再添加如下配置: # 多人聊天 CHANNEL_LAYERS {"default":{"BACKEND": "channels.layers.InMemoryChannelLayer"} }因此完整的se…

基础学习:(5)不同卷积:transposed convolution,deconvolution,dilated convolution

基础学习:(5)不同卷积 文章目录 基础学习:(5)不同卷积前言1 deconvlution transposed convolution2 对比2.1 Convolution animations2.2 Transposed convolution animations2.3 Dilated convolution 前言 …

Windows安装Jira

下载 Download Jira Data Center | Atlassian https://product-downloads.atlassian.com/software/jira/downloads/atlassian-jira-software-10.3.0-x64.exe 以管理员身份安装,否则弹出以下提醒 创建和配置MySQL数据库:参照 Connecting Jira applicat…

采用qL-MPC技术进行小型固定翼无人机的路径跟随控制

来自论文"Predictive Path-Following Control for Fixed-Wing UAVs Using the qLMPC Framework in the Presence of Wind Disturbances" 控制架构 采用的是 ULTRA-Extra无人机,相关参数如下: 这里用于guidance law的无人机运动学模型为&#…