机器视觉学习(七)—— 卷积、边缘和滤波器

目录

一、卷积运算

[1.1 卷积运算的公式](#1.1 卷积运算的公式)

[1.2 卷积操作](#1.2 卷积操作)

二、垂直边缘与水平边缘

[2.1 cv2.filter2D()函数](#2.1 cv2.filter2D()函数)

[2.2 Sobel算子](#2.2 Sobel算子)

三、滤波器


一、卷积运算

1.1 卷积运算的公式

卷积运算是一种图像处理的基本操作,常用于图像滤波、边缘检测等应用中。

卷积运算的基本思想是将一个图像与一个称为卷积核(或滤波器)的小矩阵进行乘积运算,然后将所有乘积的结果相加,得到最终的输出图像。这个过程可以用以下公式表示:

  1. 假设我们有一个3×3的图像:

    1 2 3
    4 5 6
    7 8 9

  2. 而我们有一个3×3的滤波器:

    -1 0 1
    -1 0 1
    -1 0 1

卷积运算的过程如下:

将滤波器与图像的一个像素窗口进行对应元素的乘法操作:

复制代码
(-1 × 1) + (0 × 2) + (1 × 3) = 2
(-1 × 4) + (0 × 5) + (1 × 6) = 2
(-1 × 7) + (0 × 8) + (1 × 9) = 2

对乘法结果进行求和以得到新的像素值:

复制代码
2 + 2 + 2 = 6

将新的像素值放置在输出图像的相应位置。

重复以上过程,对图像的每个像素都进行卷积运算,最终得到输出图像。

如图所示:

1.2 卷积操作

在OpenCV中,可以通过使用cv2.filter2D()函数来进行卷积运算。该函数接受输入图像、输出图像、卷积核等参数,可以对图像进行卷积运算并得到结果。

以下是一个使用OpenCV进行卷积运算的示例代码:

python 复制代码
import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg')

# 定义卷积核
kernel = np.array([[0, -1, 0],
                   [-1, 5, -1],
                   [0, -1, 0]])

# 进行卷积运算
result = cv2.filter2D(image, -1, kernel)

# 显示结果图像
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,我们读取了一张图像,然后定义了一个卷积核。卷积核是一个3x3的矩阵,表示一个锐化效果。最后,我们使用cv2.filter2D()函数对图像进行卷积运算,并将结果显示出来。

二、垂直边缘与水平边缘

2.1 cv2.filter2D()函数

在OpenCV中,使用cv2.filter2D()进行垂直边缘和水平边缘检测,您可以使用以下内核:

垂直边缘:

python 复制代码
kernel_vertical = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])

水平边缘:

python 复制代码
kernel_horizontal = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])

下面是一个示例代码,展示如何使用cv2.filter2D()对图像进行垂直边缘和水平边缘检测:

python 复制代码
import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg', 0)

# 定义垂直边缘和水平边缘的内核
kernel_vertical = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
kernel_horizontal = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])

# 使用cv2.filter2D()进行垂直边缘检测
vertical_edges = cv2.filter2D(image, -1, kernel_vertical)

# 使用cv2.filter2D()进行水平边缘检测
horizontal_edges = cv2.filter2D(image, -1, kernel_horizontal)

# 显示原始图像和边缘图像
cv2.imshow('Original Image', image)
cv2.imshow('Vertical Edges', vertical_edges)
cv2.imshow('Horizontal Edges', horizontal_edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个例子中,我们首先使用cv2.imread()读取图像,再使用cv2.filter2D()分别应用这些内核来检测垂直边缘和水平边缘。最后,我们使用cv2.imshow()显示原始图像和边缘图像。

2.2 Sobel算子

在OpenCV中,也可以使用Sobel算子来检测图像中的垂直边缘和水平边缘。

垂直边缘检测:

python 复制代码
import cv2

# 读取图像
image = cv2.imread('image.jpg')

# 转为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Sobel算子检测垂直边缘
sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)

# 将结果取绝对值并转为无符号8位整型
sobelx = cv2.convertScaleAbs(sobelx)

# 显示结果
cv2.imshow('Vertical Edges', sobelx)
cv2.waitKey(0)
cv2.destroyAllWindows()

水平边缘检测:

python 复制代码
import cv2

# 读取图像
image = cv2.imread('image.jpg')

# 转为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Sobel算子检测水平边缘
sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)

# 将结果取绝对值并转为无符号8位整型
sobely = cv2.convertScaleAbs(sobely)

# 显示结果
cv2.imshow('Horizontal Edges', sobely)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这两个例子中,cv2.Sobel()函数用来执行Sobel算子操作。它接受以下参数:

  • gray:灰度图像。
  • cv2.CV_64F:结果图像的数据类型。
  • 1, 0:在垂直方向上计算一阶导数。
  • 0, 1:在水平方向上计算一阶导数。
  • ksize=3:Sobel算子的大小。

所得到的结果是包含边缘强度的图像,通过取绝对值,并将其转换为无符号8位整型,我们可以得到可视化的边缘图像。最后,使用cv2.imshow()函数来显示结果。

三、滤波器

OpenCV是一个开源的计算机视觉库,提供了一些滤波器的实现。

  1. 均值滤波器(Mean Filter):通过计算像素周围邻域内像素的平均值来平滑图像。可以使用**cv2.blur()**函数实现。

  2. 高斯滤波器(Gaussian Filter):根据高斯分布来对图像进行平滑处理。可以使用**cv2.GaussianBlur()**函数实现。

  3. 中值滤波器(Median Filter):通过计算像素周围邻域内像素的中值来平滑图像。可以使用**cv2.medianBlur()**函数实现。

  4. 双边滤波器(Bilateral Filter):考虑了像素的空间距离和像素之间的灰度差异,以保持边缘的清晰度。可以使用**cv2.bilateralFilter()**函数实现。

  5. 自定义滤波器(Custom Filter):可以通过定义自己的卷积核来实现自定义的滤波效果。可以使用**cv2.filter2D()**函数实现。

python 复制代码
import cv2 as cv

img = cv.imread("D:/Open_CV/OpenCV_demo/Pictures/1.1.png")
img = cv.resize(img,(300,300),interpolation = cv.INTER_AREA)       # 图像缩放 (长,宽)

blur = cv.blur(img,(5,5))                               # 均值滤波
gaussian = cv.GaussianBlur(img,(7,7),10)                # 高斯滤波
median = cv.medianBlur(img,5)                           # 中值滤波
bila = cv.bilateralFilter(img,9,75,75)                  # 双边滤波

cv.imshow("img",img)
cv.imshow("blur",blur)
cv.imshow("gaussian",gaussian)
cv.imshow("median",median)
cv.imshow("bila",bila)

cv.waitKey(0)

运行结果:

相关推荐
张哈大34 分钟前
【 Redis | 实战篇 秒杀优化 】
java·数据库·redis·笔记·缓存
满怀10151 小时前
【生成式AI文本生成实战】从GPT原理到企业级应用开发
人工智能·gpt
微刻时光1 小时前
影刀处理 Excel:智能工具带来的高效变革
人工智能·python·低代码·自动化·excel·rpa·影刀rpa
笑鸿的学习笔记2 小时前
虚幻引擎5-Unreal Engine笔记之`GameMode`、`关卡(Level)` 和 `关卡蓝图(Level Blueprint)`的关系
笔记·ue5·虚幻
聚客AI3 小时前
ChatGPT到Claude全适配:跨模型Prompt高级设计规范与迁移技巧
人工智能·机器学习·语言模型·自然语言处理·langchain·transformer·llama
小羊Linux客栈3 小时前
自动化:批量文件重命名
运维·人工智能·python·自动化·游戏程序
Mr数据杨7 小时前
【Dv3Admin】插件 dv3admin_chatgpt 集成大语言模型智能模块
人工智能·语言模型·chatgpt
zm-v-159304339867 小时前
AI 赋能 Copula 建模:大语言模型驱动的相关性分析革新
人工智能·语言模型·自然语言处理
向上的车轮8 小时前
MATLAB学习笔记(七):MATLAB建模城市的雨季防洪排污的问题
笔记·学习·matlab
zhz52149 小时前
AI数字人融合VR全景:从技术突破到可信场景落地
人工智能·vr·ai编程·ai数字人·ai agent·智能体