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

目录

一、卷积运算

[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)

运行结果:

相关推荐
volcanical9 分钟前
Dataset Distillation with Attention Labels for Fine-tuning BERT
人工智能·深度学习·bert
L_cl9 分钟前
【NLP 17、NLP的基础——分词】
人工智能·自然语言处理
西西弗Sisyphus12 分钟前
大型语言模型(LLMs)演化树 Large Language Models
人工智能·语言模型·自然语言处理·大模型
车载诊断技术2 小时前
电子电气架构 --- 什么是EPS?
网络·人工智能·安全·架构·汽车·需求分析
KevinRay_2 小时前
Python超能力:高级技巧让你的代码飞起来
网络·人工智能·python·lambda表达式·列表推导式·python高级技巧
跃跃欲试-迪之2 小时前
animatediff 模型网盘分享
人工智能·stable diffusion
Captain823Jack3 小时前
nlp新词发现——浅析 TF·IDF
人工智能·python·深度学习·神经网络·算法·自然语言处理
被制作时长两年半的个人练习生3 小时前
【AscendC】ReduceSum中指定workLocal大小时如何计算
人工智能·算子开发·ascendc
Captain823Jack3 小时前
w04_nlp大模型训练·中文分词
人工智能·python·深度学习·神经网络·算法·自然语言处理·中文分词
Black_mario4 小时前
链原生 Web3 AI 网络 Chainbase 推出 AVS 主网, 拓展 EigenLayer AVS 应用场景
网络·人工智能·web3