空域滤波算法对比分析(超级全面哒)——Python代码

2024-03-02 08:18

本文主要是介绍空域滤波算法对比分析(超级全面哒)——Python代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       代码包括椒盐噪声,高斯噪声,均值滤波,中值滤波,高斯滤波,Sobel滤波,Laplace滤波和对应的系统函数以及三种常用的参数分析,MSE,PSNR,SSIM。

         太久没写博客了,懒得把知识点都写下来,有缘人看到需要报告的移步传送门去下载报告,报告上写的很详细。


图5 原图与取灰度值后的图片

 

图6 原图加信噪比0.2的椒盐噪声

图7原图加sigma=3的高斯噪声

图8 椒盐噪声,3*3均值滤波,系统3*3均值滤波

图9椒盐噪声,3*3均值滤波,7*7均值滤波

图10 高斯噪声,3*3均值滤波,5*5均值滤波


高斯滤波(加权均值滤波):


   图11 高斯噪声,5*5高斯滤波,5*5系统高斯滤波

图12 高斯噪声,3*3高斯滤波,5*5高斯滤波

图13 椒盐噪声,3*3高斯滤波,5*5高斯滤波

 

中值滤波:


图15 椒盐噪声,3*3中值滤波,3*3系统中值滤波

16 椒盐噪声,3*3中值滤波,5*5中值滤波 10*10中值滤波

 

Sobel算子滤波:

图17 原图,Sobel滤波,系统Sobel滤波

 

Laplace滤波:

图18 原图,Laplace滤波,系统Laplace滤波

#########所有函数###################
Mse 两个图片均方差
Psnr 两个图片峰值信噪比
Ssim 两个图片相似度
matrix_convolve 两矩阵卷积
add_salt_noise 加椒盐噪声	
add_gauss_noise	加高斯噪声
get_mid	取矩阵均值
get_ave 取矩阵中位数
mid_filter 中值滤波
mid_function 系统中值滤波函数
ave_filter 均值滤波
ave_function 系统均值滤波函数
gauss_filter_self 高斯滤波
gauss_function 系统高斯滤波函数
sobel_filter_self  Sobel算子锐化
sobel_function   系统Sobel算子锐化
laplacian_filter_self 拉普拉斯算子锐化
laplacian_function 系统拉普拉斯算子锐化
#######################################
import cv2 as cv
import numpy as np
import random
import math
import copy###########均方误差(MSE)###########
def mse(pc1,pc2):mse=np.mean((pc1-pc2)**2)return float(mse)
###########峰值信噪比(PSNR)##########
# PSNR高于40dB说明图像质量极好(即非常接近原始图像)
# 在30—40dB通常表示图像质量是好的(即失真可以察觉但可以接受)
# 在20—30dB说明图像质量差
# 最后 PSNR低于20dB图像不可接受
def psnr(img1, img2):mse = np.mean( (img1 - img2) ** 2 )if mse == 0:return 100plxel_max = 255.0return 20 * math.log10(plxel_max / math.sqrt(mse))
###########结构相似度(SSIM):range~[-1:1]##########
#-1表示完全不相似,1表示完全相似
def ssim(y_true, y_pred):u_true = np.mean(y_true)u_pred = np.mean(y_pred)var_true = np.var(y_true)var_pred = np.var(y_pred)std_true = np.sqrt(var_true)std_pred = np.sqrt(var_pred)c1 = np.square(0.01 * 7)c2 = np.square(0.03 * 7)ssim = (2 * u_true * u_pred + c1) * (2 * std_pred * std_true + c2)denom = (u_true ** 2 + u_pred ** 2 + c1) * (var_pred + var_true + c2)return ssim / denom
###############矩阵卷积##############
def matrix_convolve(pc,mode):n,m=pc.shapec=np.zeros((n,m),dtype=np.float)step=mode.shape[0]mode=mode/mode.sum()  # 除于加权平均for i in range(n):for j in range(m):if i-int(step/2)<0 or i+int(step/2)>=n:c[i][j]=pc[i][j]elif j-int(step/2)<0 or j+int(step/2)>= m:c[i][j]=pc[i][j]else:x=int(step/2)c[i][j]=np.sum(pc[i-x:i-x+step,j-x:j-x+step]*mode)c=c.clip(0,255)c=cv.convertScaleAbs(c) #将结果转化为8位intreturn c
###############加椒盐噪声################
def add_salt_noise(pc,maybe):#图片,噪声比n,m=pc.shapefor i in range(n):for j in range(m):if np.random.random(1)>maybe:continueelse:pc[i,j]=0
###############加高斯噪声################
def add_gauss_noise(pc,mu,sigma,k,maybe=1):#means 均值 sigma 方差n,m=pc.shapefor i in range(n):for j in range(m):if np.random.random(1)<=maybe:pc[i][j]+=k*random.gauss(mu,sigma)pc[i][j]=min(pc[i][j],255)pc[i][j]=max(pc[i][j],0)
##############求中值##############
def get_mid(pc,x,y,cnt):ans=[]for i in range(x-int(cnt/2),x+int(cnt/2)+1):for j in range(y-int(cnt/2),y+int(cnt/2)+1):ans.append(pc[i][j])ans.sort()return ans[int(len(ans)/2)+1]
##############求均值##############
def get_ave(pc,x,y,cnt):ans=0for i in range(x-int(cnt/2),x+int(cnt/2)+1):for j in range(y-int(cnt/2),y+int(cnt/2)+1):ans+=pc[i][j]return int(ans/cnt/cnt)
############中值滤波#############
def mid_filter(pc,step): #图片,几位滤波n,m=pc.shapec=np.zeros((n,m),dtype="uint8")for i in range(0,n):for j in range(0,m):if i-int(step/2)<0 or i+int(step/2)>=n:c[i][j]=pc[i][j]elif j-int(step/2)<0 or j+int(step/2)>=m:c[i][j]=pc[i][j]else:c[i][j]=get_mid(pc,i,j,step)return c
def mid_function(pc,step):c=cv.medianBlur(pc,step)return c
############均值滤波#############
def ave_filter(pc,step):n,m=pc.shapec = np.zeros((n, m), dtype="uint8")for i in range(n):for j in range(m):if i - int(step / 2) < 0 or i + int(step / 2) >= n:c[i][j] = pc[i][j]elif j - int(step / 2) < 0 or j + int(step / 2) >= m:c[i][j] = pc[i][j]else:c[i][j] = get_ave(pc,i,j,step)return c
def ave_function(pc,step):c=cv.blur(pc,(step,step))return c
###########高斯平滑#############
def gauss_filter_self(pc,step):if step==3:mode=np.array([[1,2,1],[2,4,2],[1,2,1]])if step==5:mode=np.array([[1,4,7,4,1],[4,16,26,16,4],[7,26,41,26,7],[4,16,26,16,4],[1,4,7,4,1]])return matrix_convolve(pc,mode)
def gauss_function(pc,step):c=cv.GaussianBlur(pc,(step,step),0)return c
###########Sobel###############
#sobel算子
# Gx =-1 0 1   Gy =1 2 1
#     -2 0 2       0 0 0
#     -1 0 1      -1-2-1
def sobel_filter_self(pc):c=copy.deepcopy(pc)n,m=pc.shapefor i in range(1,n-1):for j in range(1,m-1):x=int(pc[i+1,j+1])-int(pc[i-1,j+1])+int(pc[i+1,j-1])-int(pc[i-1,j-1])+int(2*pc[i+1,j])-int(2*pc[i-1,j])y=int(pc[i+1,j+1])-int(pc[i+1,j-1])+int(pc[i-1,j+1])-int(pc[i-1,j-1])+int(2*pc[i,j+1])-int(2*pc[i,j-1])c[i,j]=min(255,int(math.sqrt(x*x+y*y)))c=cv.convertScaleAbs(c)return c
def sobel_function(pc):edges=cv.Sobel(pc,cv.CV_16S,1,1)edgesh=cv.convertScaleAbs(edges)return edgesh
###########Laplacian###############
#Laplacian算子
# 0  1  0
# 1 -4  1
# 0  1  0
def laplacian_filter_self(pc):c=copy.deepcopy(pc)n,m=pc.shapefor i in range(1,n-1):for j in range(1,m-1):c[i,j]=abs(int(pc[i+1,j])+int(pc[i-1,j])+int(pc[i,j-1])+int(pc[i,j+1])-int(4*pc[i,j]))c[i,j]=min(255,c[i,j])c=cv.convertScaleAbs(c)return c
def laplacian_function(pc):edges=cv.Laplacian(pc,-1)return edges
################################
begin=cv.imread('E:/PC/4.jpg')
im=cv.imread('E:/PC/4.jpg',0) #读取图片并取灰度值
cv.imshow("begin",begin)
a=copy.deepcopy(im)
b=copy.deepcopy(im)
cv.imshow("initial",im) #输入图片
add_salt_noise(im,0.2) #椒盐噪声
add_gauss_noise(im,3,10,3) #高斯噪声
cv.imshow("add_noise",im)
add_gauss_noise(b,3,5,3)
cv.imshow("add_gauss_noise",b)ima=ave_filter(im,3) #3位均值滤波
imb=ave_function(im,3) #3位系统均值滤波
imc=ave_filter(im,5) #5位均值滤波
imd=gauss_filter_self(im,5) #5位高斯滤波
ime=gauss_function(im,3) #3位系统高斯滤波
imf=mid_filter(im,3)  #3位中值滤波
img=mid_function(im,3) #3位系统中值滤波
imh=mid_filter(im,5) #5位中值滤波
cv.imshow("ave_self_3*3",ima)
cv.imshow("ave_function_3*3",imb)
cv.imshow("ave_self_5*5",imc)
cv.imshow("gauss_self_3*3",imd)
cv.imshow("gauss_function_3*3",ime)
cv.imshow("mid_self_3*3",imf)
cv.imshow("mid_function_3*3",img)
cv.imshow("mid_self_5*5",imh)
im1=sobel_filter_self(im)#Sobel算子
im2=sobel_function(im)#系统Sobel算子
im3=laplacian_filter_self(im)#laplace算子
im4=laplacian_function(im)#系统laplace算子
cv.imshow("sobel_filter_self",im1)
cv.imshow("sobel_function",im2)
cv.imshow("laplacian_filter_self",im3)
cv.imshow("laplacian_function",im4)
print("init:MSE=%.2f PSNR=%.2f SSIM=%.2f"%(mse(a,a),psnr(a,a),ssim(a,a)))
print("add_salt:MSE=%.2f PSNR=%.2f SSIM=%.2f"%(mse(im,a),psnr(im,a),ssim(im,a)))
print("a:MSE=%.2f PSNR=%.2f SSIM=%.2f"%(mse(ima,a),psnr(ima,a),ssim(ima,a)))
print("b:MSE=%.2f PSNR=%.2f SSIM=%.2f"%(mse(imb,a),psnr(imb,a),ssim(imb,a)))
print("c:MSE=%.2f PSNR=%.2f SSIM=%.2f"%(mse(imc,a),psnr(imc,a),ssim(imc,a)))
print("d:MSE=%.2f PSNR=%.2f SSIM=%.2f"%(mse(imd,a),psnr(imd,a),ssim(imd,a)))
print("e:MSE=%.2f PSNR=%.2f SSIM=%.2f"%(mse(ime,a),psnr(ime,a),ssim(ime,a)))
print("f:MSE=%.2f PSNR=%.2f SSIM=%.2f"%(mse(imf,a),psnr(imf,a),ssim(imf,a)))
print("g:MSE=%.2f PSNR=%.2f SSIM=%.2f"%(mse(img,a),psnr(img,a),ssim(img,a)))
print("h:MSE=%.2f PSNR=%.2f SSIM=%.2f"%(mse(imh,a),psnr(imh,a),ssim(imh,a)))
print("im1:MSE=%.2f PSNR=%.2f SSIM=%.2f"%(mse(im1,a),psnr(im1,a),ssim(im1,a)))
print("im2:MSE=%.2f PSNR=%.2f SSIM=%.2f"%(mse(im2,a),psnr(im2,a),ssim(im2,a)))
print("im3:MSE=%.2f PSNR=%.2f SSIM=%.2f"%(mse(im3,a),psnr(im3,a),ssim(im3,a)))
print("im4:MSE=%.2f PSNR=%.2f SSIM=%.2f"%(mse(im4,a),psnr(im4,a),ssim(im4,a)))
cv.waitKey(0)

 

这篇关于空域滤波算法对比分析(超级全面哒)——Python代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

Open3D 基于法线的双边滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 输入参数: 输出参数: 参数影响: 2.2完整代码 三、实现效果 3.1原始点云 3.2滤波后点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述         基于法线的双边

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal