目录
一、卷积运算
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进行卷积运算的示例代码:
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是一个开源的计算机视觉库,提供了一些滤波器的实现。
-
均值滤波器(Mean Filter):通过计算像素周围邻域内像素的平均值来平滑图像。可以使用
cv2.blur()
函数实现。 -
高斯滤波器(Gaussian Filter):根据高斯分布来对图像进行平滑处理。可以使用
cv2.GaussianBlur()
函数实现。 -
中值滤波器(Median Filter):通过计算像素周围邻域内像素的中值来平滑图像。可以使用
cv2.medianBlur()
函数实现。 -
双边滤波器(Bilateral Filter):考虑了像素的空间距离和像素之间的灰度差异,以保持边缘的清晰度。可以使用
cv2.bilateralFilter()
函数实现。 -
自定义滤波器(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)
运行结果: