空域滤波算法对比分析(超级全面哒)——Python代码
生活随笔
收集整理的這篇文章主要介紹了
空域滤波算法对比分析(超级全面哒)——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代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gym102443 D.Guess th
- 下一篇: i++的认识