opencv # Sobel算子、Laplacian算子、Canny边缘检测、findContours、drawContours绘制轮廓、外接矩形

embedded/2024/12/23 1:47:10/

一、Sobel算子

案例图片

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

功能:用于计算图像梯度(gradient)的函数

参数:

src: 输入图像,它应该是灰度图像。

ddepth: 输出图像的所需深度(数据类型)。通常,你可以使用 -1 来表示与输入图像相同的深度,或者使用如 cv2.CV_64F 等来指定特定的深度。由于梯度计算可能产生负值,因此建议使用能够包含负数的数据类型。

dx: x 方向上的导数阶数。如果你想要计算 x 方向上的梯度,设置这个参数为 1;如果你不关心 x 方向上的梯度,设置这个参数为 0。

dy: y 方向上的导数阶数。如果你想要计算 y 方向上的梯度,设置这个参数为 1;如果你不关心 y 方向上的梯度,设置这个参数为 0。通常,你不会同时设置 dx 和 dy 都为 0。

ksize: Sobel 核的大小。它必须是 1、3、5、7 或 9 之一。这个参数决定了用于计算梯度的滤波器的大小。大小为 1 时表示使用最小的滤波器,但通常你会使用更大的滤波器来平滑梯度计算。

scale: 可选参数,表示计算梯度时的缩放因子。默认值为 1,表示不进行缩放。你可以通过调整这个参数来放大或缩小梯度的结果。

delta: 可选参数,表示在将结果存储到目标图像之前要添加到结果中的可选增量值。默认值为 0,表示不添加增量。

borderType: 像素外推方法,例如 cv2.BORDER_DEFAULT、cv2.BORDER_REFLECT 等。这个参数决定了在图像边界处如何处理像素外推。

import cv2
import numpy as npimg=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('1',img)
cv2.imshow('2',img_sobel)
cv2.imshow('3',img_sobel2)
cv2.waitKey(0)

 

 

二、Laplacian算子

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

功能:用于计算图像的拉普拉斯算子(Laplacian)

参数:

src: 输入图像,它应该是灰度图像。

ddepth: 输出图像的所需深度。这个参数决定了输出图像的深度(数据类型)。通常,你可以使用 -1 来表示与输入图像相同的深度,或者使用 cv2.CV_64F 等来指定特定的深度。由于拉普拉斯算子可能产生负值,因此通常建议使用能够包含负数的数据类型,如 cv2.CV_64F。

ksize: 算子的大小。它必须是 1、3、5 或 7 之一。这个参数决定了用于计算拉普拉斯算子的滤波器的大小。大小为 1 时表示使用 4 邻域拉普拉斯算子,其他大小则使用更大的滤波器。

scale: 可选参数,表示计算拉普拉斯算子时的缩放因子。默认值为 1,表示不进行缩放。你可以通过调整这个参数来放大或缩小拉普拉斯算子的结果。

delta: 可选参数,表示在将结果存储到目标图像之前要添加到结果中的可选增量值。默认值为 0,表示不添加增量。

borderType: 像素外推方法,例如 cv2.BORDER_DEFAULT、cv2.BORDER_REFLECT 等。这个参数决定了在图像边界处如何处理像素外推。当 ksize 大于 1 时,这个参数才有意义。

import cv2img=cv2.imread('./shudu.png')img_lap = cv2.Laplacian(img,-1,ksize=3)cv2.imshow('1',img)
cv2.imshow('2',img_lap)
cv2.waitKey(0)

 

三、Canny边缘检测

cv2.Canny(image, threshold1, threshold2, edges, apertureSize, L2gradient)

功能:用于边缘检测的函数

参数:

‌image‌: 输入图像,它应该是一个灰度图像(单通道)。

‌threshold1‌: 第一个阈值,用于边缘检测的滞后过程。这个值较低,用于确定边缘的初始点。

‌threshold2‌: 第二个阈值,用于边缘检测的滞后过程。这个值较高,用于确定边缘的最终点。如果某个像素点的梯度值高于这个阈值,它被认为是边缘;如果低于这个值但高于threshold1,并且与高于threshold2的像素点相连,它也被认为是边缘。

‌edges‌: 输出图像,与输入图像大小相同,但通常是二值图像(即只包含边缘和非边缘的像素)。

‌apertureSize‌(可选,默认为3): Sobel算子的大小,它决定了梯度计算的邻域大小。它必须是1、3、5或7之一。

‌L2gradient‌(可选,默认为False): 一个布尔值,指示是否使用更精确的L2范数进行梯度计算。如果为True,则使用L2范数(即欧几里得距离);如果为False,则使用L1范数(即曼哈顿距离)。L2范数通常更精确,但计算成本也更高。

import cv2img = cv2.imread('./road.png')img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)_,img_binary=cv2.threshold(img_gray,125,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)img_blur=cv2.GaussianBlur(img_binary,(3,3),3)img_canny=cv2.Canny(img_blur,30,70)cv2.imshow('0',img)
cv2.imshow('gray',img_gray)
cv2.imshow('binary',img_binary)
cv2.imshow('blur',img_blur)
cv2.imshow('canny',img_canny)
cv2.waitKey(0)

 

 

四、findContours

cv2.findContours(image, mode, method, contour, hierarchy, offset.)

功能:用于检测图像轮廓的函数

参数:

‌image‌ (必需): 输入图像,通常是一个二值图像(即只包含黑白两种颜色的图像),其中白色部分代表要检测的对象,黑色部分代表背景。也可以是非二值图像,但通常需要先进行某种形式的预处理,如阈值分割或边缘检测。

‌mode‌ (可选,某些版本中必需): 轮廓检索模式。它决定了函数如何检测轮廓。常见的模式有:

cv2.RETR_EXTERNAL:只检索最外层轮廓。

cv2.RETR_LIST:检索所有轮廓,但不创建任何父子关系。

cv2.RETR_CCOMP:检索所有轮廓,并将它们组织为两层结构,其中顶层是连通域的外边界,底层是孔的内边界。

cv2.RETR_TREE:检索所有轮廓,并重建完整的层次结构。

‌method‌ (可选,某些版本中必需): 轮廓近似方法。它决定了轮廓的近似程度。常见的方法有:

cv2.CHAIN_APPROX_NONE:存储所有的轮廓点,不进行任何近似。

cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线段,只保留它们的终点。

cv2.CHAIN_APPROX_TC89_L1、cv2.CHAIN_APPROX_TC89_KCOS:应用 Teh-Chin 链式近似算法的一种变体。

‌contours‌ (某些版本中作为返回值): 在某些 OpenCV 版本中,这个参数是用来存储检测到的轮廓的。它是一个 Python 列表,其中每个元素都是一个轮廓,轮廓是由点组成的 NumPy 数组。

‌hierarchy‌ (某些版本中作为返回值): 轮廓的层次结构信息。这是一个 NumPy 数组,包含了关于轮廓之间关系的信息(例如,哪个轮廓是另一个轮廓的父轮廓或子轮廓)。

‌offset‌ (可选,默认为 (0, 0)): 轮廓点的偏移量。这个参数允许你在原始图像坐标系的基础上对轮廓点进行平移。

五、drawContours绘制轮廓

cv2.drawContours(image, contours, contourIdx, color, thickness, lineType, hierarchy, maxLevel, offset)

功能:用于在图像上绘制轮廓的函数

参数:

image‌ (必需): 这是要在其上绘制轮廓的输入图像。它应该是一个三通道图像(例如,彩色图像)或单通道图像(例如,灰度图像),但通常是三通道图像,以便可以使用不同的颜色来绘制轮廓。

‌contours‌ (必需): 这是一个 Python 列表,包含要绘制的所有轮廓。每个轮廓都是一个点集,通常是由 cv2.findContours() 函数返回的 NumPy 数组。

‌contourIdx‌ (可选,默认为 -1): 指定要绘制的轮廓的索引。如果为 -1,则绘制所有轮廓。否则,只绘制指定索引处的轮廓。

‌color‌ (可选,默认为 (0, 255, 0)): 轮廓的颜色。它是一个三元组,表示 BGR(蓝、绿、红)颜色空间中的颜色。例如,(0, 255, 0) 表示绿色。

‌thickness‌ (可选,默认为 1): 轮廓的厚度。如果为正数,则轮廓将被绘制为指定厚度的线条。如果为负数(例如 -1),则轮廓内部将被填充。

‌lineType‌ (可选,默认为 cv2.LINE_8): 线条的类型。它决定了轮廓线条的平滑度。cv2.LINE_8 表示 8-连通线,cv2.LINE_4 表示 4-连通线,cv2.LINE_AA 表示抗锯齿线。

‌hierarchy‌ (可选,默认为 None): 轮廓的层次结构信息。这是一个 NumPy 数组,通常由 cv2.findContours() 函数返回。它包含了关于轮廓之间关系的信息,例如哪个轮廓是另一个轮廓的父轮廓或子轮廓。在绘制所有轮廓时,这个参数通常不需要。

‌maxLevel‌ (可选,默认为 INT_MAX): 用于控制绘制轮廓的层次深度。当 contourIdx 参数为 -1 时,这个参数才有效。它决定了要绘制的轮廓的最大层次深度。

‌offset‌ (可选,默认为 (0, 0)): 轮廓点的偏移量。这个参数允许你在原始图像坐标系的基础上对轮廓点进行平移。

import cv2img = cv2.imread('./number.png')img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)_,img_binary=cv2.threshold(img_gray,125,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)contours,hierarchy=cv2.findContours(img_binary,     #二值化的图cv2.RETR_LIST,  #查询轮廓方式cv2.CHAIN_APPROX_SIMPLE)        #保存轮廓坐标点的方式
img_copy=img.copy() #拷贝不然会修改图像
img_draw=cv2.drawContours(img_copy, #绘制的图像contours, #轮廓的顶点坐标集-1,#所有轮廓(0,0,255),3 #线条粗细)cv2.imshow('1',img)
cv2.imshow('2',img_draw)
cv2.waitKey(0)

 

六、外接矩形

import cv2
import numpy as npimg = cv2.imread("./outline.png")
# 灰度化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY)
# 二值化
_, img_binary = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
# 寻找轮廓
contours, _ = cv2.findContours(img_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
img_draw = img.copy()
cv2.drawContours(img_draw, contours, -1, (0, 0, 255), 2)# 给所有轮廓都绘制 外接
for i in contours:# 第一种:调用外接矩形函数,获取当前轮廓点的左上角的坐标(x, y) 宽w 高hx, y, w, h = cv2.boundingRect(i)# 画矩形cv2.rectangle(img_draw, [x, y], [x+w, y+h], (0, 255, 0), 2)# 第二种:调用最小面积外接矩形函数,获取包含三个元素的元组(中心点坐标、长宽、旋转角度)# ((center_x, center_y), (width, height), angle)ret = cv2.minAreaRect(i)# 调用cv2.boxPoints(ret)可以获取旋转矩阵的四个顶点box = np.int32(cv2.boxPoints(ret))# 绘制轮廓cv2.drawContours(img_draw, [box], -1, (255, 255, 0), 3)# 第三种:调用最小外接圆函数,获取圆心坐标 和 半径(x, y), radius = cv2.minEnclosingCircle(i)(x, y, radius) = np.int32((x, y, radius))# 画圆cv2.circle(img_draw, (x, y), radius, (255, 0, 255), 3)cv2.imshow('image', img)
cv2.imshow('image_draw', img_draw)
cv2.waitKey(0)


http://www.ppmy.cn/embedded/147952.html

相关文章

Linux驱动开发应用层 2 点亮一个LED

目录 先来聊聊sysfs sysfs的具备的优势 LED在哪里? 先来聊聊sysfs 我们下面首先简单聊一下sysfs。他很重要的原因是因为我们跟底下的设备打交道,就是可以透过我们的sysfs来操作我们底层的设备, sysfs是Linux内核中的一个虚拟文件系统&…

流存储Fluss:迈向湖流一体架构

本文整理自阿里云高级开发工程师,Flink Committer 罗宇侠老师在 Flink Forward Asia 2024上海站分论坛流批一体(二)中的分享,内容主要分为以下四个部分: 一、湖流割裂的现状和挑战 二、Fluss 湖流一体架构 三、湖流一体…

达梦官方工具 SQLark数据迁移(oracle->达梦数据库)

应国产化需求需要,需将系统中涉及的各中间件替换成国产中间件,此文介绍了从Oracle迁移数据至达梦dm8的步骤,该文在windos环境下已验证测试过 1 SQLark介绍 SQLark是一款专为信创应用开发者设计的数据库开发和管理工具。它支持快速查询、创建和管理多种类型的数据库系统&#xf…

myexcel的使用

参考: (1)api文档:https://www.bookstack.cn/read/MyExcel-2.x/624d8ce73162300b.md (2)源代码: https://github.com/liaochong/myexcel/issues 我: (1)m…

SpringBoot整合druid数据源

SprintBoot默认使用的是HikariDataSource数据源,而且上次课中我们也说了这个数据源访问速度很快,但是这里还要给大家介绍一个第三方的数据源druid,它是阿里开发的一款开源的数据源,被很多人认为是Java语言中最好的数据库连接池&am…

centos怎么安装haproxy

在CentOS上安装HAProxy的步骤如下: 添加HAProxy的官方仓库: HAProxy提供了一个官方的RPM仓库,可以通过添加这个仓库来安装最新版本的HAProxy。首先,你需要下载仓库的公钥并添加仓库: sudo rpm --import https://haprox…

PaddlePaddle推理模型利用Paddle2ONNX转换成onnx模型

训练paddleocr模型,可以按照如下教程或者直接百度其他的 PaddleOCR训练自己的数据集(中英文)(全套)和C#部署(半套)_c# paddleocr-CSDN博客 将训练后的模型转换成推理模型 -c后面是你配置的de…

圣诞快乐(h5 css js(圣诞树))

一,整体设计思路 圣诞树h5(简易) 1.页面布局与样式: 页面使用了全屏的黑色背景,中央显示圣诞树,树形由三层绿色的三角形组成,每一层的大小逐渐变小。树干是一个棕色的矩形,位于三角…