目录

一、卷积运算

1.1 卷积运算的公式

1.2 卷积操作

二、垂直边缘与水平边缘

2.1 cv2.filter2D()函数

2.2 Sobel算子

三、滤波器


一、卷积运算

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

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

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

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

如图所示:

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

1.2 卷积操作

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

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

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()进行垂直边缘和水平边缘检测,您可以使用以下内核:

垂直边缘:

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()对图像进行垂直边缘和水平边缘检测:

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算子来检测图像中的垂直边缘和水平边缘。

垂直边缘检测:

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

水平边缘检测:

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()函数实现。

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)

运行结果:

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

03-26 09:40