计算机视觉与模式识别实验1-3 图像滤波

文章目录

    • 🧡🧡实验流程🧡🧡
      • 1. 对图像加入椒盐噪声,并用均值滤波进行过滤
      • 2.对图像加入高斯噪声,并用高斯滤波进行过滤
      • 3.对图像加入任意噪声,并用中值滤波进行过滤
      • 4.读入一张灰度图像,比较不同窗口(模板)大小,分别加入高斯噪声,椒盐噪声 和其它噪声,比较不同模板大小,不同噪声下的使用均值滤波器,高斯滤波器和中值滤波的效果。
      • 5.实现高斯滤波
    • 🧡🧡全部代码🧡🧡

🧡🧡实验流程🧡🧡

1. 对图像加入椒盐噪声,并用均值滤波进行过滤

原图、加入椒盐噪声的图
在这里插入图片描述

3x3均值滤波、5x5均值滤波
在这里插入图片描述

2.对图像加入高斯噪声,并用高斯滤波进行过滤

原图、加入高斯噪声后的图.
在这里插入图片描述

高斯滤波
在这里插入图片描述

3.对图像加入任意噪声,并用中值滤波进行过滤

原图、加入椒盐噪声的图
在这里插入图片描述

中值滤波:对中心像素矩形邻域取中值来替代中心像素
在这里插入图片描述

4.读入一张灰度图像,比较不同窗口(模板)大小,分别加入高斯噪声,椒盐噪声 和其它噪声,比较不同模板大小,不同噪声下的使用均值滤波器,高斯滤波器和中值滤波的效果。

均值滤波器: 横轴(模板大小),纵轴(噪声类型)
在这里插入图片描述

高斯滤波器: 横轴(模板大小),纵轴(噪声类型)
在这里插入图片描述

中值滤波器: 横轴(模板大小),纵轴(噪声类型)
在这里插入图片描述
总结:

  • 噪声类型相同时,模板大小越大,去除噪声的效果越明显
  • 模板大小相同时,对于高斯噪声,高斯滤波器目前来看去噪效果相对好一些;对于椒盐噪声,中值滤波器表现最佳,效果明显;对于指数噪声,三个滤波器效果差不多,感官上均值滤波器略胜一筹。

5.实现高斯滤波

原理:按照如下高斯分布,将中心像素周围的像素按照高斯分布加权平均进行平滑化,越接近中心,取值越大,越远离中心,取值越小。计算平滑结果时,只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。
在这里插入图片描述
在这里插入图片描述

添加了高斯噪声的图
在这里插入图片描述

分别手动实现和调库实现结果如下:(模板大小均为5)
在这里插入图片描述
在这里插入图片描述
分析:手写的代码实现的效果要相对模糊一些,可能与选取的sigma值有关,影响了高斯分布函数的权重,从而导致周围9个像素点权重前后会略有差异。sigma 的值越大,图像就会变得更加模糊。

🧡🧡全部代码🧡🧡

import cv2
import numpy as np
import matplotlib.pyplot as pltdef cv_show(img):cv2.imshow('Image', img)cv2.waitKey(0)cv2.destroyAllWindows()
"""3-1 均值滤波
"""
I = cv2.imread('img/test1_LenaRGB.tif')
# 添加椒盐噪声
J = I.copy()
rows, cols, _ = J.shape
amount = 0.05 # 椒盐噪声占总像素的总比例
salt_vs_pepper = 0.5 # 椒与盐的比例
# ===添加盐噪声===
num_salt = np.ceil(amount * salt_vs_pepper * rows * cols) # 盐的数量
coords = [np.random.randint(0, i - 1, int(num_salt)) for i in [rows,cols]] # 随机坐标 (H,W,:)
coords = tuple(coords)  # 将列表转换为元组
J[coords[:]] = (255, 255, 255) # 改变(H,W,C)
# ===添加椒噪声===
num_pepper = np.ceil(amount * (1-salt_vs_pepper) * rows * cols)
coords = [np.random.randint(0,i-1,int(num_pepper)) for i in [rows,cols]] # 随机坐标  (H,W,:)
oords = tuple(coords)
J[coords[:]] = (0,0,0,)# 显示原图像和加噪图像
res = np.hstack((I, J))
cv_show(res)# 3x3和5x5 均值滤波
K1 = cv2.blur(J, (3, 3))
K2 = cv2.blur(J, (5, 5))
res = np.hstack((K1, K2))
cv_show(res)
"""3-2 高斯滤波
"""
I = cv2.imread('img/test1_LenaRGB.tif')
# 添加高斯噪声
J = I.copy()
gauss = np.random.normal(0, 25, J.shape) # 0表示均值,0.1表示标准差sigma,sigma越大,损坏越厉害
J = J + gauss
J = np.clip(J,a_min=0,a_max=255).astype(np.uint8) # 缩放范围为0-255# 显示原图像和加噪图像
res = np.hstack((I, J))
cv_show(res)# 高斯滤波图像
K1 = cv2.GaussianBlur(J, (5, 5), 1)
cv_show(K1)
"""3-3 中值滤波
"""
I = cv2.imread('img/test1_LenaRGB.tif')
# 添加椒盐噪声
J = I.copy()
rows, cols, _ = J.shape
amount = 0.05 # 椒盐噪声占总像素的总比例
salt_vs_pepper = 0.5 # 椒与盐的比例
# ===添加盐噪声===
num_salt = np.ceil(amount * salt_vs_pepper * rows * cols) # 盐的数量
coords = [np.random.randint(0, i - 1, int(num_salt)) for i in [rows,cols]] # 随机坐标 (H,W,:)
coords = tuple(coords)  # 将列表转换为元组
J[coords[:]] = (255, 255, 255) # 改变(H,W,C)
# ===添加椒噪声===
num_pepper = np.ceil(amount * (1-salt_vs_pepper) * rows * cols)
coords = [np.random.randint(0,i-1,int(num_pepper)) for i in [rows,cols]] # 随机坐标  (H,W,:)
oords = tuple(coords)
J[coords[:]] = (0,0,0,)# 显示原图像和加噪图像
res = np.hstack((I, J))
cv_show(res)# 3x3 中值滤波
K1 = cv2.medianBlur(J, 5)
cv_show(K1)
"""3-4 比较不同模板、不同噪声类型、不同滤波器类型的效果
"""
# 生成不同类型的噪声
def generate_noise(image, noise_type):if noise_type == 'gaussian':noise = np.random.normal(0, 50, image.shape).astype(np.float32)noisy_image = cv2.add(image.astype(np.float32), noise)elif noise_type == 'salt':salt_pepper_ratio = 0.3salt = np.where(np.random.random(image.shape) < salt_pepper_ratio, 255, 0).astype(np.uint8)noisy_image = cv2.add(image, salt)elif noise_type == 'exponential':lambd = 50noise = np.random.exponential(lambd, image.shape).astype(np.float32)noisy_image = cv2.add(image.astype(np.float32), noise)else:raise ValueError("Unsupported noise type")return noisy_image.clip(0, 255).astype(np.uint8)# 计算滤波器效果
def apply_filter(image, filter_type, kernel_size):if filter_type == 'mean':filtered_image = cv2.blur(image, (kernel_size, kernel_size))elif filter_type == 'gaussian':filtered_image = cv2.GaussianBlur(image, (kernel_size, kernel_size), 0)elif filter_type == 'median':filtered_image = cv2.medianBlur(image, kernel_size)else:raise ValueError("Unsupported filter type")return filtered_image# 读取灰度图像
image = cv2.imread('img/test1_lena.tif', cv2.IMREAD_GRAYSCALE)# 定义不同模板大小和不同噪声类型
kernel_sizes = [3, 5, 9]
noise_types = ['gaussian', 'salt', 'exponential']# 绘制结果
plt.figure(figsize=(12, 8))for i, noise_type in enumerate(noise_types):for j, kernel_size in enumerate(kernel_sizes):# 生成噪声图像noisy_image = generate_noise(image, noise_type)# 应用滤波器filtered_mean = apply_filter(noisy_image, 'mean', kernel_size)filtered_gaussian = apply_filter(noisy_image, 'gaussian', kernel_size)filtered_median = apply_filter(noisy_image, 'median', kernel_size)# 绘制结果图plt.subplot(len(noise_types), len(kernel_sizes), i * len(kernel_sizes) + j + 1)plt.imshow(filtered_median, cmap='gray')plt.title(f'Median Filter (Size: {kernel_size})(Noise: {noise_type})')plt.axis('off')plt.tight_layout()
plt.show()
"""3-5 实现高斯滤波器
"""
def noise_Gaussian(img,mean,var):J = img.copy()size = J.shapeJ = J / 255gauss = np.random.normal(0, 0.1, size)J = J + gaussJ = np.clip(J, 0, 1)  # 将像素值限制在 [0, 1] 范围内J = (J * 255).astype(np.uint8)  # 将像素值重新缩放回 [0, 255] 范围return Jori = cv2.imread('img/test1_LenaRGB.tif')
img = noise_Gaussian(ori,mean=0,var=0.1)
cv_show(img)
# print(img[100,100])def gaussian_filter(img, K_size=3, sigma=1.0):img = np.asarray(np.uint8(img))if len(img.shape) == 3:H, W, C = img.shapeelse:img = np.expand_dims(img, axis=-1)H, W, C = img.shape## Zero paddingpad = K_size // 2out = np.zeros((H + pad * 2, W + pad * 2, C), dtype=float)out[pad: pad + H, pad: pad + W] = img.copy().astype(float)## prepare KernelK = np.zeros((K_size, K_size), dtype=float)for x in range(-pad, -pad + K_size):for y in range(-pad, -pad + K_size):K[y + pad, x + pad] = np.exp( -(x ** 2 + y ** 2) / (2 * (sigma ** 2)))K /= (2 * np.pi * sigma * sigma) K /= K.sum()tmp = out.copy()## filteringfor y in range(H):for x in range(W):for c in range(C): out[pad + y, pad + x, c] = np.sum(K * tmp[y: y + K_size, x: x + K_size, c])out = np.clip(out, 0, 255)out = out[pad: pad + H, pad: pad + W].astype(np.uint8)return out# 手写实现
gs1=gaussian_filter(img,K_size=5,sigma=5)
cv_show(gs1)# 调库实现
gs2 = cv2.GaussianBlur(img, (5, 5), 1)
cv_show(gs2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/21339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.6 Docker部署多个前端项目

2.6 Docker部署多个项目 三. 部署前端项目 1.将前端项目打包到同一目录下&#xff08;tcm-ui&#xff09; 2. 部署nginx容器 docker run --namenginx -p 9090:9090 -p 9091:9091 -d nginx3. 复制nginx.conf文件到主机目录 docker cp nginx:/etc/nginx/nginx.conf /root/ja…

[学习笔记](b站视频)PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】(ing)

视频来源&#xff1a;PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】 前面P1-P5属于环境安装&#xff0c;略过。 5-6.Pytorch加载数据初认识 数据文件: hymenoptera_data # read_data.py文件from torch.utils.data import Dataset …

数据结构与算法05-链表

介绍 基于结点的数据结构拥有独特的存取方式&#xff0c;因此在某些时候具有性能上的优势。 本章我们会探讨链表&#xff0c;它是最简单的一种基于结点的数据结构&#xff0c;而且也是后续内容的基础。 你会发现&#xff0c;虽然链表和数组看上去差不多&#xff0c;但在性能上…

Go 1.23新特性前瞻

2024年5月22日&#xff0c;Go 1.23版本[1]功能特性正式冻结&#xff0c;后续将只改bug&#xff0c;不增加新feature。 对Go团队来说&#xff0c;这意味着开始了Go 1.23rc1的冲刺&#xff0c;对我们普通Gopher而言&#xff0c;这意味着是时候对Go 1.23新增的功能做一些前瞻了&am…

SAP PP学习笔记15 - MTS(Make-to-Stock) 按库存生产(策略11,策略30)

上一章学习了MTS&#xff08;Make-to-Stock&#xff09;按库存生产&#xff08;策略10&#xff09;。 SAP PP学习笔记14 - MTS&#xff08;Make-to-Stock) 按库存生产&#xff08;策略10&#xff09;&#xff0c;以及生产计划的概要-CSDN博客 本章继续讲MTS&#xff08;Make-t…

革新风暴来袭:报事报修系统小程序如何重塑报事报修体验?

随着数字化、智能化的发展&#xff0c;已经应用在我们日常生活和工作的方方面面。那么&#xff0c;你还在为物业报修而头疼吗&#xff1f;想象一下&#xff0c;家里的水管突然爆裂&#xff0c;你急忙联系物业&#xff0c;时常面临物业电话忙音、接听后才进行登记繁琐的报修单、…

Vue.js 与 TypeScript(1) :项目配置、props标注类型、emits标注类型

像 TypeScript 这样的类型系统可以在编译时通过静态分析检测出很多常见错误。这减少了生产环境中的运行时错误&#xff0c;也让我们在重构大型项目的时候更有信心。通过 IDE 中基于类型的自动补全&#xff0c;TypeScript 还改善了开发体验和效率。 一、项目配置 在使用 npm cr…

2024后端服务架构升级

文章目录 背景改造方案新架构图技术选型思考 服务拆分公共组件设计自部署算法服务排期计划 全球多活改造背景架构图分布式ID 背景 1、xx业务经过多轮的业务决策和调整&#xff0c;存在非常多技术包袱&#xff0c;带了不好的用户体验和极高的维护成本 2、多套机房部署&#xf…

简单、免费、强大的高效率截图工具神器——Snipaste(下载安装+常用快捷键教学)

一、简介 Snipaste是一款功能强大的截图和贴图工具&#xff0c;它允许用户快速截取屏幕上的任意区域&#xff0c;并将截图以浮窗形式显示在屏幕上。用户可以自由调整浮窗的位置和大小&#xff0c;甚至将浮窗设置为半透明&#xff0c;以便在查看屏幕内容时不会遮挡视线。此外&a…

[数据结构]字典树

概念&#xff1a; 字典树是一种数据结构&#xff0c;常用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;。主要思想是利用字符串的公共前缀来节约存储空间。 实现原理&#xff1a; 在开发的过程中如果需要使用字典树&#xff0c;不必自己…

图的创建和遍历

孤勇者探险&#xff08;图的遍历&#xff09; 作者 YJ 单位 西南石油大学 一款名为“孤勇者探险”的游戏&#xff0c;游戏中共有若干个小岛&#xff0c;每个岛上均有怪兽&#xff0c;闯关者打倒岛上的怪兽则可获得该岛对应的游戏积分&#xff08;每个岛的积分根据难度可能不相…

【recast-navigation-js】使用three.js辅助绘制Agent

目录 说在前面使用Tweakpane添加CrowAgent其他 说在前面 操作系统&#xff1a;windows 11浏览器&#xff1a;edge版本 124.0.2478.97recast-navigation-js版本&#xff1a;0.29.0golang版本&#xff1a;1.21.5 使用Tweakpane fps面板interface FPSGraph extends BladeApi<B…

JAVA流程控制--For循环

1.虽然所有循环都可以用while或do...while表示&#xff0c;但Java提供了另外一种语句——for循环&#xff0c;使一些循环结构变得简单 2.for循环语句是支持迭代的一种通用结构&#xff0c;是最有效&#xff0c;最灵活的循环&#xff0c;结构 3.for循环执行的次数是在…

单元测试的心法分享

大家好&#xff0c;我是G探险者&#xff01; 今天我们简单聊聊单元测试的哪些事儿~ 两天时间我玩明白了单元测试的套路。 这里我分享一下思路。 在我眼里单元测试室什么&#xff1f; 请看这张草图&#xff1a; 单元测试主要关注单个代码单元&#xff08;通常是类或方法&am…

Docker成功启动Rabbitmq却访问不了管理页面问题解决

目录 启动步骤&#xff1a; 无法访问问题总结&#xff1a; 启动步骤&#xff1a; 拉取镜像&#xff1a; docker pull rabbitmq 运行&#xff1a; docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq进入容器&#xff1a; docker exec -it 容器id /bin/…

python基础知识点总结(第二节判断与循环)

一、判断语句 1、if判断语句 ~if语句的基本格式 if 要判断的条件&#xff1a; 条件成立时&#xff0c;要做的事情 ~if语句的注意事项&#xff1a; 判断语句的结果一定要是布尔类型不要忘记判断条件后的&#xff1a;冒号归属于if语句的代码块&#xff0c;需要在前方填…

【操作与配置】VS2017与MFC环境配置

【操作与配置】VS2017与MFC环境配置 概述 Visual Studio 是一款强大且多功能的集成开发环境&#xff08;IDE&#xff09;&#xff0c;适用于软件开发人员和团队。使用此应用程序&#xff0c;您可以构建和调试现代Web应用程序&#xff0c;并利用扩展帮助探索几乎任何编程语言。…

PySide6在VScode中提示:vscode module not found error: no module named ‘pyside6‘解决方案

最近在B站学习PySide6&#xff1a;PySide6百炼成真&#xff0c;带你系统性入门Qt https://www.bilibili.com/video/BV1c84y1N7iL?p3&vd_source256724e7f8bba144c62a17f9fa758a04 学习到第3节&#xff1a;003基础框架 003基础框架 from PySide6.QtWidgets import QApplicat…

【讲解下常见的分类算法,什么是分类算法?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

千锋教育大优惠

IT全学科自学至尊卡&#xff08;3年卡&#xff09; Linux云计算运维、Python全栈、数据分析、人工智能、Java、大前端、网络安全、物联网、全媒体、影视剪辑等14大主流方向&#xff0c;300精品视频课程免费学。课程持续更新&#xff0c;电脑端手机APP小程序多平台无忧畅学&…