Python OpenCV精讲系列 - 高级图像处理技术(三)

news2024/9/19 13:47:11

在这里插入图片描述

💖💖⚡️⚡️专栏:Python OpenCV精讲⚡️⚡️💖💖
本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计,从基础概念入手,逐步深入到图像处理、特征检测、物体识别等多个领域。适合希望在计算机视觉方向上建立坚实基础的技术人员及研究者。每一课不仅包含理论讲解,更有实战代码示例,助力读者快速将所学应用于实际项目中,提升解决复杂视觉问题的能力。无论是入门者还是寻求技能进阶的开发者,都将在此收获满满的知识与实践经验。

1. 图像滤波

图像滤波是一种用于去除噪声、平滑图像或增强图像特征的技术。OpenCV提供了多种滤波方法,包括均值滤波、高斯滤波、中值滤波等。

1.1 均值滤波

均值滤波通过替换每个像素值为其邻域内的平均值来平滑图像。

blurred = cv2.blur(src, ksize)
  • 参数

    • src:输入图像。
    • ksize:核大小,是一个元组,定义了滤波器的尺寸。
  • 返回值

    • blurred:平滑后的图像。
  • 详细解释

    • 原理

      • 均值滤波是一种简单的线性滤波器,通过计算每个像素周围邻域的平均值来替代该像素的值。
      • 滤波器的尺寸通常为奇数,例如3×3或5×5,这样可以保证滤波器中心位于像素上。
    • 应用

      • 均值滤波常用于去除图像中的随机噪声,如椒盐噪声。
      • 这种滤波器会模糊图像的细节,因此不适合用于保留图像中的边缘和其他重要特征。
    • 注意事项

      • 大尺寸的滤波器会导致更多的模糊效果。
      • 过大的滤波器尺寸可能会使图像失去重要的细节。
    • 实现细节

      • 在均值滤波过程中,每个像素的新值是由其邻域内所有像素值的平均值得出的。
      • 滤波器核的大小决定了平滑的程度。较大的核会带来更强的平滑效果,但可能会损失更多的细节。
      • 滤波器核通常是对称的,例如3×3核中的所有值都是相同的,等于1/9。
    • 局限性

      • 均值滤波器无法区分噪声和图像中的重要特征,因此在处理图像时可能会模糊掉重要的细节。
      • 对于椒盐噪声,均值滤波器可能会使噪声更加明显,因为噪声点周围的像素值会被平均到噪声点上。
1.2 高斯滤波

高斯滤波通过应用高斯核来平滑图像,可以有效去除高斯噪声。

blurred = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY=None)
  • 参数

    • src:输入图像。
    • ksize:核大小,是一个元组,定义了滤波器的尺寸。
    • sigmaX:沿X轴的标准差。
    • sigmaY:沿Y轴的标准差,如果为None则与sigmaX相同。
  • 返回值

    • blurred:平滑后的图像。
  • 详细解释

    • 原理

      • 高斯滤波器是一种非均匀线性滤波器,它使用高斯函数作为权重分布。
      • 核大小通常为奇数,例如3×3或5×5。
      • 标准差sigma决定了高斯核的宽度,较大的sigma会使核更宽,从而导致更多的模糊效果。
    • 应用

      • 高斯滤波器非常适合去除高斯噪声,同时保持图像的重要特征。
      • 由于高斯核的特性,它可以很好地保持图像的边缘和其他重要特征。
    • 注意事项

      • 如果sigmaXsigmaY为0,则OpenCV会根据ksize的大小来计算标准差。
      • sigmaXsigmaY的值应该与ksize相匹配,以获得最佳的效果。
    • 实现细节

      • 高斯核的形状由标准差sigma决定,sigma越大,核越宽。
      • 核的尺寸ksize应根据sigma来选择,通常ksize应为sigma的6倍左右。
      • 高斯核的中心值最高,随着距离中心的距离增加,权重逐渐减小。
    • 局限性

      • 高斯滤波器可能会模糊图像中的某些细节,特别是对于较小的特征。
      • 对于非常小的sigma值,高斯滤波器的效果与均值滤波器相似。
1.3 中值滤波

中值滤波通过替换每个像素值为其邻域内的中值来去除噪声。

blurred = cv2.medianBlur(src, ksize)
  • 参数

    • src:输入图像。
    • ksize:核大小,定义了滤波器的尺寸。
  • 返回值

    • blurred:平滑后的图像。
  • 详细解释

    • 原理

      • 中值滤波器是一种非线性滤波器,它通过计算每个像素周围邻域内的中值来替代该像素的值。
      • 滤波器的尺寸通常为奇数,例如3×3或5×5。
    • 应用

      • 中值滤波器特别适合去除椒盐噪声,因为它能够有效地抑制这种类型的噪声,同时保持图像的边缘和其他重要特征。
      • 这种滤波器对于图像中的细小纹理和细节也有很好的保持效果。
    • 注意事项

      • 大尺寸的滤波器会导致更多的模糊效果。
      • 过大的滤波器尺寸可能会使图像失去重要的细节。
    • 实现细节

      • 在中值滤波过程中,每个像素的新值是由其邻域内所有像素值排序后的中位数得出的。
      • 滤波器核的大小决定了平滑的程度。较大的核会带来更强的平滑效果,但可能会损失更多的细节。
      • 中值滤波器对于椒盐噪声非常有效,因为它能够忽略极端的值,只保留中间值。
    • 局限性

      • 中值滤波器可能会使图像的边缘变得稍微模糊,因为边缘处的像素值会被其邻域内的中值所替代。
      • 对于连续的噪声,中值滤波器可能不如均值滤波器或高斯滤波器有效。

在这里插入图片描述

2. 边缘检测

边缘检测用于识别图像中的边缘,有助于突出图像的关键特征。

2.1 Canny边缘检测

Canny边缘检测是一种常用的边缘检测算法,可以有效识别图像中的边缘。

edges = cv2.Canny(image, threshold1, threshold2)
  • 参数

    • image:输入图像。
    • threshold1:低阈值。
    • threshold2:高阈值。
  • 返回值

    • edges:边缘检测后的图像。
  • 详细解释

    • 原理

      • Canny边缘检测算法包括以下几个步骤:
        1. 高斯滤波:去除图像中的噪声。
        2. 计算梯度:计算图像的梯度幅度和方向。
        3. 非极大值抑制:保留局部最大值的梯度,去除其他梯度。
        4. 双阈值检测:使用高低两个阈值来确定哪些梯度是边缘。
        5. 边缘连接:连接断开的边缘,形成连续的边缘线。
    • 应用

      • Canny边缘检测算法可以有效地检测图像中的边缘,并且在大多数情况下能够获得良好的结果。
      • 它非常适合用于后续的图像分析任务,如轮廓检测和形状识别。
    • 注意事项

      • threshold1threshold2用于控制边缘检测的灵敏度,通常threshold2threshold1的2到3倍。
      • 较高的阈值可以减少误检,但可能会丢失一些细节;较低的阈值可以检测更多的边缘,但也可能引入噪声。
    • 实现细节

      • Canny边缘检测算法首先会对图像进行高斯滤波,以去除噪声。
      • 然后使用Sobel算子计算图像的梯度。
      • 非极大值抑制步骤会保留每个像素的梯度值,如果该像素的梯度值不是局部最大值,则被设为零。
      • 双阈值检测步骤会根据设定的高低阈值来确定哪些梯度是边缘。
      • 最后的边缘连接步骤会连接那些被标记为边缘的像素,形成连续的边缘线。
    • 局限性

      • Canny边缘检测算法对于噪声敏感,因此在噪声较大的图像中可能无法很好地检测边缘。
      • 边缘检测的结果依赖于阈值的选择,不当的阈值可能会导致边缘检测不准确。
2.2 Sobel算子

Sobel算子是一种基于梯度的边缘检测方法。

sobelx = cv2.Sobel(src, ddepth, dx, dy, ksize)
  • 参数

    • src:输入图像。
    • ddepth:输出图像的深度。
    • dx:在X方向上的导数阶数。
    • dy:在Y方向上的导数阶数。
    • ksize:Sobel算子的大小。
  • 返回值

    • sobelx:Sobel算子处理后的图像。
  • 详细解释

    • 原理

      • Sobel算子通过计算图像在X和Y方向上的梯度来检测边缘。
      • Sobel算子通常使用3×3的核大小。
      • X方向的Sobel算子为:
        [
        \begin{bmatrix}
        -1 & 0 & 1 \
        -2 & 0 & 2 \
        -1 & 0 & 1 \
        \end{bmatrix}
        ]
      • Y方向的Sobel算子为:
        [
        \begin{bmatrix}
        1 & 2 & 1 \
        0 & 0 & 0 \
        -1 & -2 & -1 \
        \end{bmatrix}
        ]
    • 应用

      • Sobel算子通常用于计算X方向和Y方向的梯度,然后通过求模得到最终的边缘强度。
      • 这种方法可以有效地检测图像中的强边缘。
    • 注意事项

      • Sobel算子对于噪声比较敏感,因此通常会在应用Sobel算子之前对图像进行高斯滤波。
      • Sobel算子的大小会影响边缘检测的结果,较大的核大小可以检测到更粗的边缘。
    • 实现细节

      • Sobel算子通过计算图像在X和Y方向上的梯度来确定边缘的位置。
      • X方向的梯度反映了像素值在水平方向的变化率,Y方向的梯度反映了像素值在垂直方向的变化率。
      • 为了得到最终的边缘强度,可以计算X方向和Y方向梯度的模,或者使用梯度向量的幅值。
    • 局限性

      • Sobel算子对于噪声敏感,容易受到图像中噪声的影响。
      • Sobel算子可能会检测到虚假的边缘,特别是对于噪声较大的图像。
      • 对于非常细的边缘,Sobel算子可能会产生较宽的边缘响应。

在这里插入图片描述

3. 阈值化处理

阈值化处理用于将图像转换为二值图像,以便于后续的图像分析。

3.1 简单阈值化

简单阈值化是最直接的二值化方法。

ret, thresh = cv2.threshold(src, threshold, maxval, type)
  • 参数

    • src:输入图像。
    • threshold:阈值。
    • maxval:超过阈值的最大值。
    • type:阈值类型,如cv2.THRESH_BINARY(白色背景黑色前景)或cv2.THRESH_BINARY_INV(黑色背景白色前景)。
  • 返回值

    • ret:实际使用的阈值。
    • thresh:阈值处理后的图像。
  • 详细解释

    • 原理

      • 简单阈值化将图像中的像素值与给定的阈值进行比较。
      • 如果像素值大于阈值,则将其设为maxval;否则设为0。
    • 应用

      • 简单阈值化适用于图像对比度较高的场景,其中前景和背景之间的差异非常明显。
      • 它是进行后续图像分析和处理的基础。
    • 注意事项

      • 阈值的选择对结果有很大影响。选择不当可能会导致重要信息的丢失。
      • 对于具有复杂光照条件的图像,可能需要使用自适应阈值化。
    • 实现细节

      • 在简单阈值化过程中,每个像素的新值要么是maxval,要么是0,这取决于像素值是否超过了给定的阈值。
      • 阈值的选择至关重要,过高或过低都会导致错误的结果。
      • 简单阈值化适用于图像对比度较高且背景和前景差异明显的场景。
    • 局限性

      • 简单阈值化对于光照不均匀的图像效果不佳,因为全局阈值难以适用于整个图像。
      • 对于图像中的不同区域,可能需要不同的阈值才能得到良好的二值化结果。
3.2 自适应阈值化

自适应阈值化自动调整局部阈值,适用于光照不均匀的场景。

thresh = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
  • 参数

    • src:输入图像。
    • maxValue:超过阈值的最大值。
    • adaptiveMethod:自适应方法,如cv2.ADAPTIVE_THRESH_MEAN_C(基于邻域均值)或cv2.ADAPTIVE_THRESH_GAUSSIAN_C(基于邻域加权均值)。
    • thresholdType:阈值类型,如cv2.THRESH_BINARYcv2.THRESH_BINARY_INV
    • blockSize:用于计算阈值的邻域大小。
    • C:从邻域均值或加权均值中减去的常数。
  • 返回值

    • thresh:阈值处理后的图像。
  • 详细解释

    • 原理

      • 自适应阈值化根据图像中的局部特征动态调整阈值。
      • 每个像素的阈值是其邻域内像素值的平均值或加权平均值减去一个常数C
      • 这种方法可以有效处理光照不均匀的图像。
    • 应用

      • 自适应阈值化非常适合处理光照不均匀的图像,例如在阴影区域和明亮区域都有重要信息的图像。
      • 它可以自动适应图像的不同区域,从而获得更好的二值化结果。
    • 注意事项

      • blockSize应该足够大以捕捉图像中的局部特征,但不能太大以至于忽略了重要的细节。
      • C的值取决于具体的应用场景,通常需要通过实验来确定合适的值。
    • 实现细节

      • 在自适应阈值化过程中,每个像素的新值是由其邻域内像素值的平均值或加权平均值减去一个常数C得出的。
      • blockSize决定了计算阈值时考虑的邻域大小。
      • C的值决定了阈值与邻域均值之间的差距,通常取较小的正值。
    • 局限性

      • 自适应阈值化可能会在图像的某些区域产生过度二值化的结果,特别是当图像中存在复杂的纹理时。
      • 对于图像中亮度变化较大的区域,自适应阈值化可能会导致边缘模糊或断裂。

在这里插入图片描述

4. 综合示例

接下来,我们将结合上述几种技术,创建一个综合示例。在这个示例中,我们将读取一张图像,对其进行高斯滤波、Canny边缘检测和阈值化处理,最后显示处理后的图像。

import cv2
import numpy as np

def process_image(image_path):
    # 读取图像
    image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

    if image is None:
        print("Error: File not found!")
        return

    # 高斯滤波
    blurred = cv2.GaussianBlur(image, (5, 5), 0)

    # Canny边缘检测
    edges = cv2.Canny(blurred, 50, 150)

    # 阈值化处理
    ret, thresh = cv2.threshold(edges, 127, 255, cv2.THRESH_BINARY)

    # 显示图像
    cv2.imshow('Original Image', image)
    cv2.imshow('Blurred Image', blurred)
    cv2.imshow('Edges Image', edges)
    cv2.imshow('Thresholded Image', thresh)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    image_path = 'path/to/your/image.jpg'
    process_image(image_path)
5. 小结

在本篇文章中,我们详细介绍了如何使用OpenCV进行图像滤波、边缘检测和阈值化处理。这些技术在图像处理中非常常见,并且是许多高级应用的基础。接下来的文章将涉及更复杂的图像处理技术,如形态学操作、轮廓检测等。

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

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

相关文章

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合&a…

HAProxy--高性能反向代理

文章目录 Web架构负载均衡介绍为什么使用负载均衡负载均衡类型 HAProxy简介应用场景HAProxy是什么HAProxy功能 脚本安装HAProxy基础配置global多进程和线程HAProxy日志配置项 Proxies配置-listen-frontend-backendserver配置 frontendbackend配置实例子配置文件 HAProxy调度算法…

SRS流媒体服务器从入门到精通(其一,环境搭建)

欢迎诸位来阅读在下的博文~ 在这里,在下会不定期发表一些浅薄的知识和经验,望诸位能与在下多多交流,共同努力! 江山如画,客心如若,欢迎到访,一展风采 文章目录 一、SRS简介二、SRS的应用场景三、环境搭建…

(计算机网络)应用层

1.为什么需要应用层 应用层提供使用tcp,udp使用的方式 协议就是制定的规则 2.域名服务器概述 域名是唯一的 新增域名,大家都要修改这个文本文件,所以要进行集中管理这个文本文件,而不是使用本地的hosts文件 hosts文件在Windows系统…

智能厕所系统高科技打造公厕新生态丨深圳讯鹏科技

从人们踏入智能厕所的那一刻起,便能深切感受到科技的力量。智能感应门悄然无声地开启,仿佛在欢迎每一位使用者。这种感应门不仅方便快捷,更避免了传统公厕门的直接接触,减少了细菌交叉感染的风险。走进厕所内部,智能灯…

Golang | Leetcode Golang题解之第397题整数替换

题目: 题解: func integerReplacement(n int) (ans int) {for n ! 1 {switch {case n%2 0:ansn / 2case n%4 1:ans 2n / 2case n 3:ans 2n 1default:ans 2n n/2 1}}return }

掌握Flux的各种风格表现,另外,flux也有了滑块Lora

在AIGC知识库通过#flux标签,汇总了下最近整理的内容,部分如下,更多可见AIGC知识库。 shadow: 经常在画图的时候,会有选择困难症,这下可以直接翻阅查看自己喜欢的风格,参考使用 ↓ Flux Style Te…

安装oh-my-zsh后报错zsh: command not found: conda问题解决

zsh: command not found: conda问题解决 一、问题介绍与环境介绍 系统为macOS Sonoma 14.5 所用终端为zsh 主要问题:安装了oh-my-zsh之后conda命令在终端中不可用。 二、原因分析 终端中zsh的可访问的程序一般放在/bin, /usr/bin, /usr/local/bin,~/bi…

快速了解高并发解决方案

对《高并发的哲学原理》的个人总结,原书地址如下 https://pphc.lvwenhan.com/ 本书的核心思想就是拆分,服务细化拆分多资源并行。 通用设计方法 例子:每秒100万次http请求 通过架构解决性能问题,在面对并发需求时&#xff…

【Python系列】JSON和JSONL简介

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

动手学深度学习(一)简介+预备知识+基础知识(上)

一、简介 1、机器学习 机器学习研究如何使用经验改善计算机系统的性能。 2、表征学习 表征学习是机器学习的一类,研究的是,如何自动学习出数据合适的表示方式,更好地由输入得到正确的输出。 3、深度学习 深度学习是具有多级表示的表征学…

SpringCloud微服务详细笔记(一):微服务介绍--微服务拆分--RestTemplate远程调用--Nacos注册中心

目录 1.认识微服务 1.1单体架构 1.2微服务 1.3SpringCloud 2.微服务拆分 2.1服务拆分原则 2.1.1什么时候拆? 2.1.2怎么拆? 2.2微服务项目结构: 2.3服务拆分示例: 2.4远程调用 2.4.1RestTemplate 2.4.2远程调用示例 …

Qt篇——Qt使用C++获取Windows电脑上所有外接设备的名称、物理端口位置等信息

我之前有发过一篇文章《Qt篇——获取Windows系统上插入的串口设备的物理序号》,文章中主要获取的是插入的USB串口设备的物理序号;而本篇文章则进行拓展,可以获取所有外接设备的相关信息(比如USB摄像头、USB蓝牙、USB网卡、其它一些…

前端转鸿蒙好做吗

在科技不断发展的当下,许多前端开发者可能会思考一个问题:前端转鸿蒙好做吗? 一、前端与鸿蒙开发的差异 1. 技术栈的变化 前端开发主要涉及 HTML、CSS、JavaScript 等技术,而鸿蒙开发则需要掌握 Java、Kotlin、JavaScript 等语言&#xff0c…

远程存储 RDMA

什么是 RDMA RDMA(Remote Direct Memory Access)指的是远程直接内存访问,这是一种通过网络在两个应用程序之间搬运缓冲区里的数据的方法。 Remote:数据通过网络与远程机器间进行数据传输。 Direct:没有内核的参与&am…

计算机毕业设计 | 基于SpringBoot的健身房管理系统(附源码)

1,项目背景 随着人们生活水平的提高和健康意识的增强,越来越多的人开始关注自己的身体健康并加入到健身行列中。然而,传统的健身房管理方式往往存在诸多问题,如会员信息管理混乱、课程安排不合理、教练资源分配不均等&#xff0c…

MaxCompute基础概论

1. 简介与背景 随着大数据技术的发展,企业和组织面临着处理海量数据的挑战。传统的数据存储和处理工具难以应对高并发、复杂计算以及海量数据的快速增长需求。为了解决这些问题,阿里云推出了 MaxCompute(原名 ODPS),这…

超声波雪深监测站

超声波雪深监测站是一种用于测量和监测雪深的设备。它的功能和作用主要包括以下几个方面: 雪深测量:超声波雪深监测站能够通过发射超声波并接收回波的方式,测量雪地表面到地面之间的距离,从而得到雪深的数据。通过分析和处理这些数…

图像去噪的艺术:自适应中值滤波器的应用与实践

在数字图像处理的众多挑战中,噪声的去除是一个永恒的话题。特别是椒盐噪声,因其随机将像素点变为极黑或极白,对图像的视觉质量破坏极大。本文将通过MATLAB实现的自适应中值滤波器(AMF),探讨其在图像去噪中的…

--- 数据结构 二叉树 --- java

树形结构 数使一个非线性结构,他是由n个结点组成的具有一定层次关系的集合,叫做树是因为他像是一颗倒挂的树,根在上,叶子在下,具有一些性质 1,有一个特殊节点叫做根节点,他没有钱去节点&#x…