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

2024-06-03 01:36

本文主要是介绍计算机视觉与模式识别实验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)

这篇关于计算机视觉与模式识别实验1-3 图像滤波的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025665

相关文章

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将