在计算机视觉领域,图像平滑处理是一个重要的任务,用于降低噪声,提高图像质量。常见的图像平滑算法有均值滤波、中值滤波、高斯滤波等。本文将介绍这些算法的原理,并分别给出使用Python与Halcon实现的代码。(当前版本:python3.9、halcon19)
均值滤波是最简单的图像平滑方法,将每个像素替换为其周围像素的平均值。
中值滤波是一种非线性滤波,在处理脉冲噪声以及椒盐噪声时效果极佳,能够有效的保护好图像的边缘信息。
均值滤波,也就是计算每一个像素点周围像素点(包括该点)的平均值,作为该像素点滤波之后的值,通常取以该像素点为中心的矩形窗口内的所有像素点来计算平均值,矩形窗口的大小一般为33,55,99,…,(2n+1)(2n+1)。
窗口越大,滤波效果越好,但是图像也变得更加模糊,所以需要根据实际情况设置矩形窗口的大小。比如3*3窗口的均值滤波如下图所示,点(x,y)的滤波值由其周围9个点(包括其自身)计算平均值得到。
在Python中,可以使用NumPy库实现均值滤波。以下是Python代码示例:
import numpy as np
import cv2
def blur(image):
return np.mean(image, axis=0)
# 读取图像
image = cv2.imread('path/to/your/image.jpg')
# 应用均值滤波
blurred_image = blur(image)
# 显示原始图像与均值滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在Halcon中,可以使用mean_image算子实现均值滤波。以下是Halcon代码示例:
* 定义图像
read_image (Image, 'path/to/your/image.jpg')
* 转换为灰度图像
rgb1_to_gray (Image, GrayImage)
* 应用均值滤波
mean_image (GrayImage, Image, 6,6)
* 显示原图像与均值滤波后的图像
dev_display (Image)
dev_display (Image)
中值滤波是一种非线性滤波方法,将每个像素替换为其邻域内像素值的中值,如下图,红色方块中央是方块内9个字排序后的中值。
在Python中,可以使用NumPy库实现中值滤波。以下是Python代码示例:
import numpy as np
import cv2
def median_filter(image, kernel_size):
return np.median(image, axis=0)
# 读取图像
image = cv2.imread('yourpic.jpg')
# 应用中值滤波
median_filtered_image = median_filter(image, kernel_size=(3, 3))
# 显示原始图像与中值滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Median Filtered Image', median_filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在Halcon中,可以使用MedianBlur算子实现中值滤波。以下是Halcon代码示例:
* 定义图像
read_image(Image,'youimage.jpg')
* 转换为灰度图像
rgb1_to_gray (Image, GrayImage)
* 应用中值滤波
median_image(Image,ImageMedian,'square',3,3)
* 显示原图像与中值滤波后的图像
dev_display (Image)
dev_display (Image)
高斯滤波是一种线性滤波方法,将每个像素替换为其邻域内像素值的加权平均。
要模糊一张图像,可以这么做:对于每个像素点,以它为中心,取其3x3区域内所有像素灰度值的平均作为中心点的灰度值。可是,如果仅使用简单平均,显然不是很合理,因为图像都是连续的,越靠近的点关系越密切,越远离的点关系越疏远。
因此,加权平均更合理,距离越近的点权重越大,距离越远的点权重越小。而正态分布显然是一种可取的权重分配模式。由于图像是二维的,所以需要使用二维的高斯函数。
高斯模糊本质上就是利用 高斯函数 生成的 高斯核(高斯模板) 对图像进行卷积操作。
将这9个值加起来,就是中心点25进行高斯滤波后的值。对所有点重复这个过程,就得到了高斯模糊后的图像。
在Python中,可以使用NumPy库实现高斯滤波。以下是Python代码示例:
import numpy as np
def gaussian_filter(image, sigma):
filtered_image = np.gaussian_filter(image, sigma=sigma, axis=0)
return filtered_image
# 读取图像
image = cv2.imread('path/to/your/image.jpg')
# 应用高斯滤波
gaussian_filtered_image = gaussian_filter(image, sigma=3)
# 显示原始图像与高斯滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Gaussian Filtered Image', gaussian_filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在Halcon中,可以使用gauss_filter算子实现高斯滤波。以下是Halcon代码示例:
* 定义图像
read_image (Image, 'path/to/your/image.jpg')
* 转换为灰度图像
rgb1_to_gray (Image, GrayImage)
* 应用高斯滤波
gauss_filter(Image,ImageGauss,3)
* 显示原图像与高斯滤波后的图像
dev_display (Image)
dev_display (Image)
这些基本的图像平滑算法在实际应用中非常有用。根据特定需求,还可以使用其他高级滤波方法,如双边滤波、Sobel算子等。
双边滤波结合了空间滤波(比如均值滤波)和高斯滤波的优点,同时考虑了像素之间的空间距离和像素值的相似性。
在Python中,可以使用NumPy库实现双边滤波。以下是Python代码示例:
import numpy as np
def bilateral_filter(image, sigma_r, sigma_g, sigma_b, filter_size):
"""
bilateral_filter(image, sigma_r, sigma_g, sigma_b, filter_size)
:param image: 要进行滤波的图像
:param sigma_r: 半径为 r 的邻域内像素值的方差
:param sigma_g: 半径为 g 的邻域内像素值的方差
:param sigma_b: 半径为 b 的邻域内像素值的方差
:param filter_size: 滤波核大小
:return: 处理后的图像
"""
filtered_image = np.zeros((image.shape[0], image.shape[1], 3), np.uint8)
for r in range(filter_size - 1):
for g in range(filter_size - 1):
for b in range(filter_size - 1):
# 计算加权系数
weights = np.exp(np.log(sigma_r) * (r - filter_size / 2)) * np.exp(np.log(sigma_g) * (g - filter_size / 2)) * np.exp(np.log(sigma_b) * (b - filter_size / 2))
# 应用双边滤波
filtered_image[r + (filter_size - 1) * (r + g + b):r + (filter_size - 1) * (r + g + b) + image.shape[0],
g + (filter_size - 1) * (r + g + b):g + (filter_size - 1) * (r + g + b) + image.shape[1],
b + (filter_size - 1) * (r + g + b):b + (filter_size - 1) * (r + g + b) + image.shape[1],
cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP] + image[r + (filter_size - 1) * (r + g + b):r + (filter_size - 1) * (r + g + b) + image.shape[0],
g + (filter_size - 1) * (r + g + b):g + (filter_size - 1) * (r + g + b) + image.shape[1],
b + (filter_size - 1) * (r + g + b):b + (filter_size - 1) * (r + g + b) + image.shape[1],
cv2.INTER_LINEAR + weights]
return filtered_image
# 读取图像
image = cv2.imread('path/to/your/image.jpg')
# 应用双边滤波
bilateral_filtered_image = bilateral_filter(image, 5, 5, 5, (5, 5))
# 显示原图像与双边滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Bilateral Filtered Image', bilateral_filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在Halcon中,可以使用bilateral_filter算子实现双边滤波。以下是Halcon代码示例:
* 图像双边滤波
* 读取图像
read_image(src,'fabrik')
* 添加噪声
add_noise_white(src,src_noise,20)
* 双边滤波
bilateral_filter(src_noise,src_noise,result,5,20,[],[])
dev_display(result)
本章讲述了图像平滑的四种常见处理方式,下一章节,我们将对图像增强的常见算法做深入探究。
喜欢的朋友就点个赞、收藏一下哈,再会!