OpenCV自学笔记十:图像平滑处理

目录

1. 均值滤波(Mean Filter):

2. 方框滤波(Box Filter):

3. 高斯滤波(Gaussian Filter):

4. 中值滤波(Median Filter):

5. 双边滤波(Bilateral Filter):

6. 2D卷积原理:


1. 均值滤波(Mean Filter):

均值滤波(Mean Filter)是一种常用的图像滤波方法,用于降低图像中的噪声。其原理是将图像中每个像素的值替换为它周围邻域内像素值的平均值。

具体步骤如下:
1. 定义需要进行均值滤波的图像和滤波器大小。
2. 对于图像中的每个像素,确定以该像素为中心的邻域范围。
3. 将邻域内的所有像素值相加,并除以邻域中像素的总数,得到平均值。
4. 将该平均值作为新的像素值,替代原始像素值。
5. 重复以上步骤,直到处理完图像中的所有像素。以下是一个使用OpenCV库实现均值滤波的简单示例代码:

import cv2

def mean_filter(image, kernel_size):
    # 应用均值滤波器
    blurred = cv2.blur(image, (kernel_size, kernel_size))
    return blurred

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

# 设置滤波器的大小
kernel_size = 5

# 进行均值滤波
filtered_image = mean_filter(image, kernel_size)

# 显示原始图像和滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Filtered Image', filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述示例中,我们使用了OpenCV的`blur()`函数来实现均值滤波。`blur()`函数接受两个参数,第一个参数是输入图像,第二个参数是滤波器的大小(这里设置为5x5)。最后,通过`imshow()`函数显示原始图像和滤波后的图像。

2. 方框滤波(Box Filter):

方框滤波(Box Filter)是一种常用的图像滤波方法,也被称为均值滤波器。与均值滤波类似,方框滤波将图像中每个像素的值替换为其周围邻域内像素值的平均值。

具体步骤如下:
1. 定义需要进行方框滤波的图像和滤波器大小。
2. 对于图像中的每个像素,确定以该像素为中心的邻域范围。
3. 将邻域内的所有像素值相加,并除以邻域中像素的总数,得到平均值。
4. 将该平均值作为新的像素值,替代原始像素值。
5. 重复以上步骤,直到处理完图像中的所有像素。以下是一个使用OpenCV库实现方框滤波的简单示例代码:
 

import cv2

def box_filter(image, kernel_size):
    # 应用方框滤波器
    blurred = cv2.boxFilter(image, -1, (kernel_size, kernel_size))
    return blurred

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

# 设置滤波器的大小
kernel_size = 5

# 进行方框滤波
filtered_image = box_filter(image, kernel_size)

# 显示原始图像和滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Filtered Image', filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述示例中,我们使用了OpenCV的`boxFilter()`函数来实现方框滤波。`boxFilter()`函数接受三个参数,第一个参数是输入图像,第二个参数是输出图像的深度(-1表示与输入图像相同的深度),第三个参数是滤波器的大小(这里设置为5x5)。最后,通过`imshow()`函数显示原始图像和滤波后的图像。

3. 高斯滤波(Gaussian Filter):

高斯滤波(Gaussian Filter)是一种常用的图像滤波方法,通过对图像进行平滑处理来减少噪声和细节。与均值滤波器相比,高斯滤波器在计算像素邻域内的加权平均值时考虑了距离中心像素的远近。

具体步骤如下:
1. 定义需要进行高斯滤波的图像和滤波器大小。
2. 根据滤波器大小计算生成一个标准的高斯核(高斯函数),该核是一个二维矩阵,其中每个元素表示相应距离中心像素的权重。
3. 对于图像中的每个像素,确定以该像素为中心的邻域范围。
4. 将邻域内的所有像素值与对应位置上的高斯核元素进行乘积,并将结果相加得到加权平均值。
5. 将该加权平均值作为新的像素值,替代原始像素值。
6. 重复以上步骤,直到处理完图像中的所有像素。以下是一个使用OpenCV库实现高斯滤波的简单示例代码:

import cv2

def gaussian_filter(image, kernel_size):
    # 应用高斯滤波器
    blurred = cv2.GaussianBlur(image, (kernel_size, kernel_size), 0)
    return blurred

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

# 设置滤波器的大小
kernel_size = 5

# 进行高斯滤波
filtered_image = gaussian_filter(image, kernel_size)

# 显示原始图像和滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Filtered Image', filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述示例中,我们使用了OpenCV的`GaussianBlur()`函数来实现高斯滤波。`GaussianBlur()`函数接受三个参数,第一个参数是输入图像,第二个参数是滤波器的大小(这里设置为5x5),第三个参数是高斯核的标准差(设置为0表示自动根据滤波器大小计算)。最后,通过`imshow()`函数显示原始图像和滤波后的图像。

4. 中值滤波(Median Filter):

中值滤波(Median Filter)是一种常用的非线性图像滤波方法,主要用于去除图像中的椒盐噪声等离群点。中值滤波将图像中每个像素的值替换为其邻域内像素值的中值。

具体步骤如下:

1. 定义需要进行中值滤波的图像和滤波器大小。

2. 对于图像中的每个像素,确定以该像素为中心的邻域范围。

3. 将邻域内的所有像素值排序,取其中值(如果邻域大小为奇数,则中值是排序后的中间值;如果邻域大小为偶数,则中值是排序后的中间两个值的平均值)。

4. 将该中值作为新的像素值,替代原始像素值。

5. 重复以上步骤,直到处理完图像中的所有像素。

以下是一个使用OpenCV库实现中值滤波的简单示例代码:

import cv2

def median_filter(image, kernel_size):

# 应用中值滤波器

blurred = cv2.medianBlur(image, kernel_size)

return blurred

# 读取图像

image = cv2.imread('input.jpg')

# 设置滤波器的大小

kernel_size = 5

# 进行中值滤波

filtered_image = median_filter(image, kernel_size)

# 显示原始图像和滤波后的图像

cv2.imshow('Original Image', image)

cv2.imshow('Filtered Image', filtered_image)

cv2.waitKey(0)

cv2.destroyAllWindows()

在上述示例中,我们使用了OpenCV的`medianBlur()`函数来实现中值滤波。`medianBlur()`函数接受两个参数,第一个参数是输入图像,第二个参数是滤波器的大小(这里设置为5x5)。最后,通过`imshow()`函数显示原始图像和滤波后的图像。

5. 双边滤波(Bilateral Filter):

双边滤波(Bilateral Filter)是一种常用的图像滤波方法,能够在减少噪声的同时保留图像的边缘信息。与其他线性滤波方法不同,双边滤波器在计算像素值时考虑了两个因素:空间距离和灰度相似性。

具体步骤如下:

1. 定义需要进行双边滤波的图像、滤波器大小、空间域标准差和灰度域标准差。

2. 对于图像中的每个像素,确定以该像素为中心的邻域范围。

3. 计算每个像素与中心像素之间的空间距离和灰度相似性,并根据这两个因素计算一个权重。

4. 将邻域内的每个像素乘以对应位置上的权重,并将结果相加得到加权平均值。

5. 将该加权平均值作为新的像素值,替代原始像素值。

6. 重复以上步骤,直到处理完图像中的所有像素。

以下是一个使用OpenCV库实现双边滤波的简单示例代码:

import cv2

def bilateral_filter(image, d, sigma_color, sigma_space):

# 应用双边滤波器

blurred = cv2.bilateralFilter(image, d, sigma_color, sigma_space)

return blurred

# 读取图像

image = cv2.imread('input.jpg')

# 设置滤波器的参数

d = 9 # 邻域直径

sigma_color = 75 # 灰度相似性标准差

sigma_space = 75 # 空间域标准差

# 进行双边滤波

filtered_image = bilateral_filter(image, d, sigma_color, sigma_space)

# 显示原始图像和滤波后的图像

cv2.imshow('Original Image', image)

cv2.imshow('Filtered Image', filtered_image)

cv2.waitKey(0)

cv2.destroyAllWindows()

在上述示例中,我们使用了OpenCV的`bilateralFilter()`函数来实现双边滤波。`bilateralFilter()`函数接受四个参数,第一个参数是输入图像,第二个参数是邻域直径(滤波器大小),第三个参数是灰度相似性标准差,第四个参数是空间域标准差。最后,通过`imshow()`函数显示原始图像和滤波后的图像。

6. 2D卷积:

2D卷积(二维卷积)是一种常用的图像处理操作,用于滤波、特征提取等任务。它是通过对输入图像与一个卷积核(也称为滤波器或内核)进行逐元素乘积,并将结果相加得到输出值的操作。

具体的2D卷积过程如下:
1. 定义输入图像和卷积核。
2. 将卷积核与输入图像的对应位置进行逐元素乘积。
3. 将所有乘积结果相加得到一个累加值。
4. 将该累加值作为输出图像中对应位置的像素值。
5. 重复以上步骤,直到遍历完整个输入图像。

数学表达式可以表示为:

Output(x, y) = sum_i(sum_j(Input(x+i, y+j) * Kernel(i, j)))


其中,`x` 和 `y` 是输出图像的坐标,`i` 和 `j` 是卷积核的坐标。

在每次计算中,卷积核以一个固定的步幅(stride)在输入图像上滑动,与输入图像的局部区域进行逐元素乘积并求和,得到输出图像的一个像素值。

2D卷积可以应用于许多图像处理任务,例如边缘检测、模糊、锐化、特征提取等。通过使用不同的卷积核,可以实现不同的滤波效果和特征提取操作,从而对图像进行改善、分析和理解。

你可能感兴趣的:(opencv,笔记,人工智能)