当前位置: 首页 > article >正文

24.11.4 OpenCV 图像滤波 卷积核概念 图像平滑处理 图像边缘处理 图像边缘检测 图像形态学操作 学习笔记

图像滤波

所为图像滤波通过滤波器得到另一个图像

什么是滤波器

在深度学习中,滤波器又称为卷积核,滤波的过程成为卷积

卷积核概念

一般为奇数:3*3,5*5,7*7 

为什么卷积核大小是奇数?

原因是:保证 锚点 在中间,防止位置发生偏移的原因

卷积核大小的影响

在深度学习中,卷积核越大,看到的信息越多,提取的特征越好,同时计算量越大

图像平滑处理

图像噪声的定义和性质‌‌

图像噪声‌是指存在于图像数据中的不必要的或多余的干扰信息

图像噪声的分类

图像噪声可以根据其来源和性质进行分类。主要分为外部噪声和内部噪声。外部噪声是由外部环境因素引起的,如光线变化、电磁干扰等。内部噪声则是由设备本身的因素引起的,如传感器噪声、电路噪声等。

 

高斯滤波

高斯滤波是图像处理中常用的一种平滑滤波方法,其主要作用是去除图像中的噪声,并减少图像细节,以实现图像的平滑处理

 

高斯滤波的使用场景包括但不限于:

  1. 去除高斯噪声: 高斯滤波可以有效地去除高斯噪声,因为该滤波器在计算像素值时会对周围像素进行加权平均,从而抑制噪声的影响。

  2. 模糊处理: 由于高斯滤波会平均周围像素的值,因此它也可用于实现图像的模糊处理,例如在某些需求下需要模糊化处理的图像或区域。

  3. 提取大致轮廓: 由于高斯滤波会平滑图像细节,因此在一定程度上可以帮助提取图像的大致轮廓和结构特征。

cv2.GaussianBlur() 是 OpenCV 库中用于图像模糊处理的函数之一。该函数可以对图像进行高斯模糊处理,即在每个像素周围使用高斯核来加权平均计算像素值,从而达到模糊效果。

cv2.GaussianBlur(src, ksize, sigmaX)

  • src:输入图像。

  • ksize:高斯核的大小,通常以元组 (width, height) 的形式指定。

  • sigmaX:高斯核在 x 方向上的标准差。

 

import cv2

img = cv2.imread("images/p1.png")
# 定义滤波参数
# 高斯核,必须是奇数
k = (3, 3)
# 标准差
d = 999
# 高斯去噪
# 作用:1. 去除噪声,2. 保留图片的轮廓
gs_img = cv2.GaussianBlur(img, k, d)
# 显示图片
cv2.imshow("gs_img", gs_img)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

双边滤波

双边滤波是图像处理中常用的一种平滑滤波方法,它可以同时平滑图像并保留边缘信息。

传统的线性滤波方法如均值滤波或高斯滤波在平滑图像的同时,可能会模糊或模糊边缘。而双边滤波通过考虑像素点的空间距离和灰度差异,实现了对图像进行平滑的同时,尽量保留图像的边缘细节。

双边滤波的原理是在滤波过程中,不仅考虑像素点与周围像素点之间的空间距离权重,还考虑像素点与周围像素点的灰度差异权重。这样,像素点的最终值将由它的邻域像素根据这两个权重的组合来计算得出,从而平滑图像的同时保留边缘信息。

双边滤波适用于各种类型的图像,特别适合于那些需要平滑处理但仍保留边缘细节的图像,例如人脸识别、图像增强和图像去噪等领域。

cv2.bilateralFilter() 是 OpenCV 库中用于图像滤波处理的函数之一。该函数可以对图像进行双边滤波处理,即在保持边缘清晰的同时,对图像进行平滑处理。

cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace) 函数接受四个参数:

  • src:输入图像。

  • d:滤波器的直径,用于指定在每个像素周围考虑的像素邻域大小。一般为正奇数

  • sigmaColor:颜色空间的标准差,用于控制滤波过程中颜色相似性的权重。较大的值意味着更宽松的颜色相似性条件。

  • 大 sigmaColor 值:当 sigmaColor 较大时,颜色差异较大的像素也会被赋予较大的权重,这意味着滤波器会在更大范围内进行平滑处理,导致图像细节的丢失较多。

  • 小 sigmaColor 值:当 sigmaColor 较小时,只有颜色差异较小的像素会被赋予较大的权重,滤波器主要在颜色相似的区域内进行平滑处理,这样可以更好地保留边缘和细节

  • sigmaSpace:坐标空间的标准差,用于控制滤波过程中空间相似性的权重。较大的值意味着更宽松的空间相似性条件。

  • 大 sigmaSpace 值:当 sigmaSpace 较大时,空间上距离较远的像素也会被赋予较大的权重,这意味着滤波器会在更大的空间范围内进行平滑处理,导致图像的局部细节被进一步平滑。

  • 小 sigmaSpace 值:当 sigmaSpace 较小时,只有空间上距离较近的像素会被赋予较大的权重,滤波器主要在局部范围内进行平滑处理,这样可以更好地保留局部细节和边缘信息 ​

 

import cv2

img = cv2.imread("images/p3.png")
# 定义双边滤波参数
# 图像像素点的直径
c = 7
# 颜色的权重
color = 200
# 空间权重
space = 30
d_img = cv2.bilateralFilter(img, c, color, space)
# 显示原图和滤波后的图片
cv2.imshow("original", img)
cv2.imshow("d_img", d_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

中值滤波

中值滤波是图像处理中常用的一种平滑滤波方法,其主要作用是去除图像中的胡椒噪声或其他类型的脉冲噪声。

中值滤波的原理是将每个像素点周围的邻域像素按照灰度值大小进行排序,然后取中间值作为该像素点的输出值。因为椒盐噪声或脉冲噪声的灰度值通常远远偏离周围像素的灰度值,通过中值滤波可以有效地将这些异常值去除,从而使图像变得更加平滑。

中值滤波适用于各种类型的图像,特别适合于那些受到椒盐噪声干扰的图像,例如传感器捕获的图像或者在传输过程中受到干扰的图像

cv2.medianBlur()是OpenCV中的一个函数,用于对图像进行中值滤波处理。中值滤波是一种常见的图像处理技术,可用于去除图像中的椒盐噪声或斑点噪声。这个函数的语法如下:

 cv2.medianBlur(src, ksize)

其中:

  • src 是输入的图像。

  • ksize 是用于中值滤波的孔径大小,必须是大于1的奇数,例如3、5、7等。

 

import cv2

img = cv2.imread("images/p1.png")
# 定义中值滤波的参数,滤波的孔径,是奇数
r = 7
m_img = cv2.medianBlur(img, r)
# 显示图片
cv2.imshow("m_img", m_img)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像边缘检测

Canny边缘检测

import cv2

img = cv2.imread("images/wenzi01.jpeg")
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 高斯滤波
ksize_gs = (11,11)
sigma_gs = 1
gs_img = cv2.GaussianBlur(gray, ksize_gs, sigma_gs)
# 定义阈值
lower = 140
upper = 232
# 获取图片边缘信息
edged = cv2.Canny(gs_img, lower, upper)

cv2.imshow("gs_img", gs_img)
cv2.imshow("edged", edged)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

图像形态学操作

腐蚀

import cv2
import numpy as np

# 读取图像
img = cv2.imread("images (1)/images/ceshi02.jpg")

# 定义构造元素
kernel = np.ones((9, 9), np.uint8)
# 腐蚀迭代次数
num = 1
# 腐蚀操作
img_erode = cv2.erode(img, kernel, num)
cv2.imshow("img_erode", img_erode)
cv2.waitKey(0)
cv2.destroyAllWindows()

膨胀

import cv2
import numpy as np

# 读取图像
img = cv2.imread("images (1)/images/ceshi01.jpeg")

# 定义构造元素
kernel = np.ones((3, 3), np.uint8)
# 膨胀迭代次数
num = 3
# 膨胀操作
img_dilate = cv2.dilate(img, kernel, iterations=num)
cv2.imshow("img_dilate", img_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

开运算

import cv2
import numpy as np

img = cv2.imread("images (1)/images/kai.jpg")
# 定义开运算的卷积核
k = np.ones((7,7), np.uint8)
# 开运算,先腐蚀再膨胀
img_open = cv2.morphologyEx(img, cv2.MORPH_OPEN, k)
cv2.imshow("img_open", img_open)
cv2.waitKey(0)
cv2.destroyAllWindows()

闭运算

import cv2
import numpy as np

img = cv2.imread("images (1)/images/bi01.jpeg")
# 定义开运算的卷积核
k = np.ones((7,7), np.uint8)
# 闭运算:先膨胀后腐蚀
img_open = cv2.morphologyEx(img, cv2.MORPH_CLOSE, k)
cv2.imshow("img_open", img_open)
cv2.waitKey(0)
cv2.destroyAllWindows()

形态学梯度

import cv2
import numpy as np

img = cv2.imread("images (1)/images/xtx.gif")
# 定义开运算的卷积核
k = np.ones((3,3), np.uint8)
# 梯度:原图-侵蚀=边框
img_open = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, k)
cv2.imshow("img_open", img_open)
cv2.waitKey(0)
cv2.destroyAllWindows()

顶帽

import cv2
import numpy as np

img = cv2.imread("images (1)/images/kai.jpg")
# 定义开运算的卷积核
k = np.ones((7,7), np.uint8)
# 顶帽: 原图减去开运算,得到大图形外的小图形
img_open = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, k)
cv2.imshow("img_open", img_open)
cv2.waitKey(0)
cv2.destroyAllWindows()

黑帽

import cv2
import numpy as np

img = cv2.imread("images (1)/images/bi01.jpeg")
# 定义开运算的卷积核
k = np.ones((7,7), np.uint8)
# 闭运算:先膨胀后腐蚀
img_open = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, k)
cv2.imshow("img_open", img_open)
cv2.waitKey(0)
cv2.destroyAllWindows()

 


http://www.kler.cn/a/380052.html

相关文章:

  • 「Mac畅玩鸿蒙与硬件15」鸿蒙UI组件篇5 - Slider 和 Progress 组件
  • Python酷库之旅-第三方库Pandas(193)
  • BFV/BGV全同态加密方案浅析
  • C++11新特性之Lambda函数
  • 代码随想录day20 二叉树(七)
  • 【补题/atccoder】Toyota Programming Contest 2024#7(AtCoder Beginner Contest 362)
  • OpenAI + asyncio 异步调用
  • MoonBit 双周报 Vol.59:新增编译器常量支持,改进未使用警告,支持跨包函数导入...多个关键技术持续优化中!
  • python NLTK快速入门
  • 计算机网络:网络层 —— 移动 IP 技术
  • 力扣904-水果成篮-两种思路
  • 【Kettle的安装与使用】使用Kettle实现mysql和hive的数据传输(使用Kettle将mysql数据导入hive、将hive数据导入mysql)
  • 思科路由器静态路由配置
  • 讲讲⾼并发的原则?
  • 从 vue 源码看问题 — vue 初始化都做了什么事?
  • CentOS Linux教程(11)--查看文件
  • RK3229 Android9自定义一个按键实现长按短按
  • 鸿蒙next字符串基础:掌握字符串操作与多语言支持
  • 如何选择最适合的消息队列?详解 Kafka、RocketMQ、RabbitMQ 的使用场景
  • Seelen UI 界面介绍与苹果界面类似
  • 易泊车牌识别相机:夜间识别的卓越之选
  • 【大语言模型】ACL2024论文-04 PriveLM-Bench: 语言模型多层次隐私评估基准
  • Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
  • 网络爬虫的定义
  • [pdf,epub]105页《分析模式》漫谈合集01
  • 深入剖析卷积神经网络中的卷积核