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

2023-11-05

一、什么是图像滤波

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

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

二、均值滤波

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 或更大):较大的核会更强烈地平滑图像,可能会使图像看起来更加模糊。这在噪声较多或需要强烈平滑的情况下可能很有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像构成与信号处理之三——图像滤波 的相关文章

随机推荐

  • thinkpad e480 f1键常亮没有声音

    我这里说的电脑指的是 ThinkPad E480 可能你会发现自己的电脑莫名其妙的没有声音了 此时你的F1键可能亮 也可能不亮 但你如果再关机重启 那么你会发现 你的F1键 极大的可能是不亮的 有很多人说是Fn f1键 但这不是根本 关键在
  • 关于DllRegisterServer的调用失败的问题解决办法

    今天在注册ActiveX控件时出错了 错误提示是XXX ocx已加载 但是DllRegisterServer调用失败 其实在日常的工作中 用regsvr32 命令注册dll ocx等时 这种模块已加载 但DllRegisterServer的
  • matlab 非极大值抑制,Matlab nonmaxsup——非最大值抑制 hysthresh—— 联合开发网 - pudn.com...

    Matlab 所属分类 matlab例程 开发工具 matlab 文件大小 4466KB 下载次数 88 上传日期 2014 05 10 17 18 37 上 传 者 廖志伟 说明 nonmaxsup 非最大值抑制 hysthresh 设定
  • kp = sift.detect(gray,None)cv2.error: Unknown C++ exception from OpenCV code

    在我们学习opencv的时候 会遇到一下算法的专利问题 比如我这次学习中在使用SIFT算法来检测角点时 下面分享一下如何解决SIFT不能只用的问题 原代码 import cv2 import numpy as np img cv2 imre
  • 若依框架图片上传、富文本框编辑器功能

    文章目录 一 前言 二 效果 三 编码过程 1 前端 index vue projectShow js 富文本框 Editor index vue 图片上传 ImgUploadCropper index vue 2 后端 实体Project
  • plc 变量的数据类型

    标准数据类型 布尔型数据类型 布尔型变量可被赋予 TRUE 真或 FALSE 假 这个值为逻辑量 占用1 位存储空间 整型数据类型 整型变量可以是 BYTE WORD DWORD SINT USINT INT UINT DINT 和UDIN
  • Pentaho学习笔记

    一 Pentaho 整体架构 cc 二 Client tools 1 Report Designer 报表创建工具 如果想创建复杂数据驱动的报表 这是合适工具 2 Design Studio 这是基于eclipse的工具 你可以使用它来创建
  • [咕噜Todo]我写了一个简单易用的todo pc工具、希望你也喜欢。

    官网 https anfo fun group 工作台 使用tags灵活分类 还可以设置子任务 视图管理等 日历 直观了解计划完成情况 轻松应对deadline 动态 根据tags连接世界 与朋友一起进步 正在做 客户端的功能 多任务并行也
  • 如何将Hyperledger Fabric PoC应用程序部署到云端

    我假设你已经学习了如何构建Hyperledger Fabric区块链网络 并且你还学习了如何在Node js或Fabric支持的其他语言中创建链代码 并且你已经学会了如何在这样的基础上开发Web应用程序在网络上 否则建议你先看看使用Hype
  • 串口服务器能发ttl信号吗,串口服务器是怎么实现通信的

    串口服务器是怎么实现通信的 复制链接 串口服务器作用通过串口把工业设备通过有线 RJ45 或无线 WIFI 的方式连连接到以太网上 来实现设备的远程传输与管理 那么串口服务器通信是怎么样通信的呢 下面就以众山设备ZSE310为例 介绍串口服
  • Python图片批量自动抠图去背景

    今天发现个好东西啊 叫片刻抠图 是一个在线对图片自动抠图去除背景的网站 只要上传图片 就可以自动把背景去掉把目标对象抠出来 不管是动物 汽车或各种产品 还是人物 都可以全自动做到令人惊艳的抠图效果 而且还说可以做到发丝级 AI 自动抠图 作
  • 牛客编程1-给定区间[-2^31, 2^31]内的3个整数A、B和C,请判断A+B是否大于C。

    给定区间 2 31 2 31 内的3个整数A B和C 请判断A B是否大于C include
  • 09. bs4解析基础与实例

    目录 前言 bs4的安装 bs4使用基础 bs4实例 获取某网站菜价 代码实现 完整代码 重要提醒 总结 前言 我们已经具备了基本的HTML知识 能够简单的识别HTML源代码中的各类元素 这一节我们将正式学习bs4的用法 并用一个实例来展示
  • EasyAR_无法打开“EasyAR“,因为无法验证开发者

    原文地址 https blog csdn net lxh worldpeace article details 107098524 今天用Android Studio编译一个项目 偶遇这个问题 说我的AS是从哪哪下载的 无法保证安全性之类的
  • 【C/C++】浮点数大小的比较问题分析及解决方案

    1 问题 在实际工程当中时常会遇到浮点数float的比较 但常规的比较思路是不可靠的 C C Java python JavaScript等主流语言都存在这个问题 存在巨大的工程隐患 例如 float a 0 9f float c 1 0f
  • vs code配置C/C++开发环境

    第一步 下载 Vs Code 点击链接下载Vs Code 下载版本 并安装 https code visualstudio com 点击 Download for Windwos 安装时 如图 请一定要勾选 添加到PATH 环境变量 其他选
  • css文字覆盖线性渐变,利用css使文字渐变

    mark c 本博客加入QQ群就是这个效果 代码来至 青找博客英文名 Qing Zhao mark c 效果图 HTML 一个人真正优秀的特质来自于内心想要变得更加优秀的那种强烈的渴望 和对生命的追求那种火热的激情 CSS masked p
  • 【docker】docker部署tomcat

    目录 1 1 搜索tomcat镜像 1 2 拉取tomcat镜像 1 3 创建容器 设置端口映射 目录映射 1 4 测试 1 1 搜索tomcat镜像 docker search tomcat 1 2 拉取tomcat镜像 docker p
  • Python开发是面向过程、函数还是对象?

    Python虽然是解释型语言 但从设计之初就已经是一门面向对象的语言 对于Python来说一切皆为对象 正因为如此 在Python中创建一个类和对象是很容易的 当然如果习惯面向过程或者函数的写法也是可以的 Python并不做硬性的限制 Py
  • 图像构成与信号处理之三——图像滤波

    一 什么是图像滤波 图像滤波是一种常见的图像处理技术 用于平滑图像 去除噪声和边缘检测等任务 其工作的原理是通过提前设定滤波器 将滤波器作用与原图像 得到拥有需要的滤波效果的图像 一般图像滤波分为平滑类 均值滤波 去噪类 中值滤波 突出边缘