【Python_Opencv图像处理框架】边缘检测、轮廓检测、图像金字塔

写在前面

本篇文章是opencv学习的第四篇文章,主要讲解了边缘及轮廓检测的主要操作,并对两种图像金字塔简单的介绍了一下,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正😍


写在中间

一、Canny边缘检测

( 1 )简单介绍

Canny边缘检测是一种常用的图像处理算法,它能够在图像中快速准确地识别出物体的边缘。

边缘检测算法步骤:

首先使用高斯滤波器对原始图像进行滤波,用于去除图像中的噪声

然后计算图像的梯度,通过阈值处理以便识别出图像中的边缘

接着使用非极大值抑制,避免假阳性和重复检测。

最后使用双阈值算法进行边缘连接和筛选

( 2 )操作实现

cv2.Canny(img, 120, 250)

这三个参数是用于Canny边缘检测的阈值参数。其中:

  • img是需要进行边缘检测的图像。

  • 120是低阈值,用于过滤掉弱边缘。

  • 250是高阈值,用于较好地保留强边缘。

在Canny边缘检测中,像素点的灰度值如果大于高阈值,就被认为是强边缘,如果小于低阈值,就被认为是非边缘。如果在两者之间,那么只有与强边缘相连通的像素点才被认为是边缘。通过调整这两个阈值,可以控制检测到的边缘数量和质量。

( 3 )代码实现

import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread("D:\python\Program\pythonProject\photos\\bear.png", 0)

v1 = cv2.Canny(img, 100, 150)
v2 = cv2.Canny(img, 20, 70)

res = np.hstack((v1, v2))  # 拼接

cv2.imshow('result', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

( 4 )效果展示

在这里插入图片描述


二、图像金字塔

(1)简单介绍

图像金字塔是一种特殊的多尺度图像结构,它可以在不同尺度下对图像进行表示,从而实现对图像局部特征的提取。

图像金字塔通常由两个部分组成,即高斯金字塔拉普拉斯金字塔

高斯金字塔:可以通过向下采样法得到较小的图片,也可以通过向上采样法得到较大的图片。

   向下采样法(缩小)

   向上采样法(增大)

拉普拉斯金字塔:则是指将两个相邻尺度的高斯金字塔图像相减得到的亮度差异图像。

   低通滤波

   降采样(缩小尺寸)

   内插(放大尺寸)

   带通滤波(图像相减)

(2)操作实现

向下采样法:img_down = cv2.pyrDown(img)

向上采样法:img_up = cv2.pyrUp(img_down)

拉普拉斯:img_laplacian = cv2.subtract(img, img_up)

拉普拉斯采样法就是先将原始图像向下采样,接着向上采样,最后将原始图像减去两次采样的结果。

( 3 )代码展示

import cv2
img = cv2.imread("D:\python\Program\pythonProject\photos\\bear.png", 0)

img_down = cv2.pyrDown(img)  # 向下采样
img_up = cv2.pyrUp(img_down)  # 向上采样
img_laplacian = img - img_up  # 拉普拉斯金字塔
cv2.imshow('Original', img)
cv2.imshow('Down', img_down)
cv2.imshow('Up', img_up)
cv2.imshow('Laplacian', img_laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()

(3)效果展示

原图:

在这里插入图片描述

向下采样:

在这里插入图片描述

向上采样:

在这里插入图片描述

拉普拉斯金字塔:

在这里插入图片描述


三、轮廓检测

( 1 )简单介绍

轮廓检测是指在图像中检测出所有轮廓,并将它们可视化。下面是 OpenCV 中轮廓检测的基本步骤:

  1. 读取图像:使用cv2.imshow()函数读取图像。

  2. 转换为灰度图像:为了检测出轮廓,需要将图像转换为灰度图像。可以使用 cv2.cvtColor() 函数将图像从 BGR 颜色空间转换为灰度颜色空间。

  3. 二值化:使用 cv2.threshold() 函数将灰度图像转换为二值图像。这一步可以将图像中的白色区域和黑色区域分开。

  4. 轮廓检测:使用 cv2.findContours() 函数检测出图像中的所有轮廓。这个函数可以返回一个轮廓列表,其中每个轮廓是一个由点组成的数组。

  5. 可视化:使用drawContours() 函数将轮廓可视化。这个函数可以将轮廓画在原始图像上,或者将轮廓绘制在其他图像上,以便进一步分析和处理。

( 2 )操作实现

轮廓检测:contours, hierarchy = cv2.findContours(img,mode,method)

img:要查找区域的二值图像

mode:几种常用图像模式

cv2.RETR_EXTERNAL:只检测最外层轮廓线。
cv2.RETR_LIST:检测所有轮廓线,但不建立轮廓之间的等级关系。
cv2.RETR_CCOMP:检测所有轮廓线,并建立两层轮廓间的等级关系(外层和内层)。
cv2.RETR_TREE:检测所有轮廓线,并重构轮廓之间的嵌套结构。

method:轮廓逼近方法

cv2.CHAIN_APPROX_NONE:存储所有轮廓点,意味着不存在轮廓线之间的点的冗余。

cv2.CHAIN_APPROX_SIMPLE:仅存储水平、竖直和对角线上的端点,使得轮廓线之间的点更加紧凑。

contours是一个列表,包含了所有找到的轮廓,每个轮廓是一个列表,包含了轮廓的坐标信息(即起点、终点、长度等)

hierarchy是一个字典,包含了每个轮廓的层级关系,即从父节点到子节点的层级关系

轮廓绘制:cv2.drawContours(copy, contours, -1, (0, 0, 255), 1)

参数含义:绘制图像,轮廓,轮廓索引,颜色模式(BGR),线条宽度

( 3 )代码实现

# 边缘检测
img = cv2.imread("D:\python\Program\pythonProject\photos\A5.png")

# 转灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 转二值图
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  # 二值化操作,像素值大于127的点用225表示,小于阈值使用0表示

# 轮廓检测
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

# 轮廓绘制
copy = img.copy()
res = cv2.drawContours(copy, contours, -1, (0, 0, 255), 2)

cv2.imshow('Laplacian', res)
cv2.imwrite("D:\python\Program\pythonProject\photos\Figure_12.png", res)
cv2.waitKey(0)
cv2.destroyAllWindows()

( 4 )效果展示

在这里插入图片描述


写在后面

👍🏻 点赞,你的认可是我创作的动力!
⭐ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

畅游星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值