图像构成与信号处理之三——图像滤波

一、什么是图像滤波

图像滤波是一种常见的图像处理技术,用于平滑图像,去除噪声和边缘检测等任务。其工作的原理是通过提前设定滤波器,将滤波器作用与原图像,得到拥有需要的滤波效果的图像。

一般图像滤波分为平滑类:均值滤波去噪类:中值滤波突出边缘:双边滤波;等。

二、均值滤波

1. 均值滤波原理

通过计算像素周围邻域内像素值的平均值来代替该像素的值。
在这里插入图片描述
类似上图,如果卷积是一个3*3的矩阵,那么矩阵滤波中每一个矩阵元素都为1/9。

(1) 一维信号

在前一篇文章**“图像构成与信号处理之二——滤波(信号部分)”**中,已经介绍过“算术平均滤波法”: o u t p u t = s u m ( i n p u t ) / l e n ( i n p u t ) output = sum(input) / len(input) output=sum(input)/len(input)

(2)二维图像信号

均值滤波也可以表示成类似的公式 I f i l t e r e d [ x , y ] = m e a n ( I [ x + i , y + j ] ) I_{filtered}[x,y]=mean(I[x+i,y+j]) Ifiltered[x,y]=mean(I[x+i,y+j]),其中I_filtered[x, y] 是滤波后的像素值,I[x+i, y+j] 是原始图像的像素值。

2. 均值滤波实现

(1)OpenCV在C++与Python中的实现

下列代码示例分别是C++和Python使用OpenCV模块进行均值滤波的示例。均值滤波使用一个滑动窗口覆盖图像的区域,然后计算窗口内像素的平均值,并将该平均值作为中心像素的新值。

#include <opencv2/opencv.hpp>

int main() {
    // 读取图像
    cv::Mat image = cv::imread("path/to/your/image.jpg", cv::IMREAD_COLOR);

    if (image.empty()) {
        std::cerr << "Could not read the image." << std::endl;
        return -1;
    }

    // 定义滤波器的大小
    int kernel_size = 11; // 奇数值,例如 3、5、7...

    // 进行均值滤波
    cv::Mat filtered_image;
    cv::blur(image, filtered_image, cv::Size(kernel_size, kernel_size));

    // 显示原始图像和滤波后的图像
    cv::imshow("Original Image", image);
    cv::imshow("Filtered Image", filtered_image);

    cv::waitKey(0);

    return 0;
}
import cv2

# 读取图像
image = cv2.imread('path/to/your/image.jpg')

if image is None:
    print("Could not read the image.")
else:
    # 定义滤波器的大小
    kernel_size =11, 11)  # 奇数值,例如 (3, 3)、(5, 5)、(7, 7)...

    # 进行均值滤波
    filtered_image = cv2.blur(image, kernel_size)

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

(2)实战

图像输入

在这里插入图片描述

kernel=11

在这里插入图片描述

kernel=21

在这里插入图片描述

三、中值滤波

1. 中值滤波原理

中值滤波是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替(因此邻域的大小必须为*),让周围的像素值接近真实值,从而消除孤立的噪声点。(类似下图的例子)

在这里插入图片描述

类似上图,如果卷积是一个3*3的矩阵,那么矩阵滤波中每一个矩阵元素分别为对应矩阵中的中位数值。

(1) 一维信号

在前一篇文章**“图像构成与信号处理之二——滤波(信号部分)”**中,已经介绍过“中位值滤波法”: o u t p u t = m e d i a n ( i n p u t ) output = median(input) output=median(input)

(2)二维图像信号

均值滤波也可以表示成类似的公式 I f i l t e r e d [ x , y ] = m e d i a n ( I [ x + i , y + j ] ) I_{filtered}[x,y]=median(I[x+i,y+j]) Ifiltered[x,y]=median(I[x+i,y+j]),其中I_filtered[x, y] 是滤波后的像素值,I[x+i, y+j] 是原始图像的像素值。

2. 中值滤波实现

(1)OpenCV在C++与Python中的实现

下列代码示例分别是C++和Python使用OpenCV模块进行中值滤波的示例。中值滤波使用一个滑动窗口覆盖图像的区域,然后计算窗口内像素的中位数值,并将该值作为中心像素的新值。

#include <iostream>
#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image = cv::imread("path/to/your/image.jpg", cv::IMREAD_GRAYSCALE);

    if (image.empty()) {
        std::cout << "Failed to read image." << std::endl;
        return -1;
    }

    cv::Mat filteredImage;
    cv::medianBlur(image, filteredImage, 11);  // 11表示滤波窗口大小,可以根据需要调整

    cv::imshow("Original Image", image);
    cv::imshow("Filtered Image", filteredImage);
    cv::waitKey(0);

    return 0;
}
import cv2

# 读取图像
image = cv2.imread('path/to/your/image.jpg')

if image is None:
    print("Could not read the image.")
else:
    # 定义滤波器的大小(必须为奇数)
    kernel_size = 5  # 例如 3、5、7...

    # 进行中值滤波
    median_filtered_image = cv2.medianBlur(image, kernel_size)

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

(2)实战(输入图片与上述实验一样)

kernel=11

在这里插入图片描述

kernel=21

在这里插入图片描述

四、高斯滤波

1. 高斯滤波原理

通过应用高斯函数来计算像素周围邻域内像素值的加权平均值,以此来代替该像素的值。详细原理可以参考以下博客。

(63条消息) 高斯滤波_MingChaoSun的博客-CSDN博客

2. 高斯滤波实现

(1)OpenCV在C++与Python中的实现

下列代码示例分别是C++和Python使用OpenCV模块进行高斯滤波的示例。高斯滤波使用一个滑动窗口覆盖图像的区域,然后计算窗口内像素的高斯函数数值,并将该值作为窗口的新值。

#include <iostream>
#include <opencv2/opencv.hpp>
usingnamespace cv;
usingnamespace std;

intmain()
{
    Mat src= imread("lena.jpg");
if (src.empty())
    {
        cout<< "Could not open or find the image"<< endl;
return-1;
    }

    Mat dst1, dst2;
// 均值滤波
    blur(src, dst1, Size(3, 3));
// 高斯滤波
    GaussianBlur(src, dst2, Size(11, 11), 0);

    imshow("Source Image", src);
    imshow("Mean Filtered Image", dst1);
    imshow("Gaussian Filtered Image", dst2);

    waitKey();
return 0;
}
import cv2

# 读取图像
image = cv2.imread('path/to/your/image.jpg')

if image is None:
    print("Could not read the image.")
else:
    # 定义滤波器的大小(必须为奇数)
    kernel_size = (5, 5)  # 例如 (3, 3)、(5, 5)、(7, 7)...

    # 定义高斯核的标准差
    sigma_x = 0  # 标准差值,0表示根据核的大小自动计算

    # 进行高斯滤波
    gaussian_filtered_image = cv2.GaussianBlur(image, kernel_size, sigma_x)

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

(2)实战(输入与上述滤波算法相同)

kernel=11

在这里插入图片描述

kernel=21

在这里插入图片描述

五、结论

通常情况下,滤波核越大,滤波效果会越平滑,但也可能导致图像细节丧失或模糊。这是因为较大的核会考虑更多的像素,从而导致局部变化被更加平均化。

同时,较大的滤波核也可能导致处理时间增加,因为计算需要考虑更多的像素。因此,在选择滤波核的大小时,需要权衡平滑效果、细节保留和计算效率。

以下是不同滤波核大小可能产生的效果:

  • 小核 (3x3 或 5x5):较小的核可以保留更多的细节,但噪声也可能被保留。适用于一些需要保留边缘和细节的情况。
  • 中等核 (7x7 或 9x9):这种大小的核可以在平滑和细节保留之间取得平衡,但可能会对某些细节造成一定程度的模糊。
  • 大核 (11x11 或更大):较大的核会更强烈地平滑图像,可能会使图像看起来更加模糊。这在噪声较多或需要强烈平滑的情况下可能很有用。
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值