58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
# 阈值邻域平滑滤波和均值滤波
|
|
import matplotlib.pyplot as plt
|
|
import cv2
|
|
import numpy as np
|
|
import random
|
|
# from ImageAddNoise import *
|
|
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
|
|
plt.rcParams['axes.unicode_minus']=False #用来正常显示负
|
|
|
|
# 添加高斯噪声
|
|
def addGaussianNoise(src,mu,sigma):
|
|
NoiseImg=src.copy()
|
|
NoiseImg=NoiseImg/NoiseImg.max()
|
|
rows,cols=NoiseImg.shape[:2]
|
|
for i in range(rows):
|
|
for j in range(cols):
|
|
#python里使用random.gauss函数加高斯噪声
|
|
NoiseImg[i,j]=NoiseImg[i,j]+random.gauss(mu,sigma)
|
|
# NoiseImg[i,j]=NoiseImg[i,j]+np.random.normal(mu,sigma)
|
|
if NoiseImg[i,j]< 0:
|
|
NoiseImg[i,j]=0
|
|
elif NoiseImg[i,j]>1:
|
|
NoiseImg[i,j]=1
|
|
NoiseImg=np.uint8(NoiseImg*255)
|
|
return NoiseImg
|
|
|
|
img = cv2.imread(r"..\img\train1.jpg",0)
|
|
row,col=img.shape
|
|
ImgGuassNoise = addGaussianNoise(img,0,0.1) #添加0均值,0.2方差的高斯分布噪声
|
|
imgAver=cv2.blur(ImgGuassNoise,(5,5))
|
|
imgThresh=np.zeros((row,col))
|
|
T=20
|
|
for i in range(row):
|
|
for j in range(col):
|
|
if np.abs(ImgGuassNoise[i,j]-imgAver[i,j])>T:
|
|
imgThresh[i,j]=imgAver[i,j]
|
|
else:
|
|
imgThresh[i,j]=ImgGuassNoise[i,j]
|
|
|
|
plt.figure(figsize=(10,6))
|
|
plt.subplot(221)
|
|
plt.imshow(img,cmap='gray')
|
|
plt.title("原图")
|
|
plt.axis('off') #不显示坐标轴
|
|
plt.subplot(222)
|
|
plt.imshow(ImgGuassNoise,cmap='gray')
|
|
plt.title("加高斯噪声图像")
|
|
plt.axis('off') #不显示坐标轴
|
|
plt.subplot(223)
|
|
plt.imshow(imgAver,cmap='gray')
|
|
plt.title("7x7均值滤波")
|
|
plt.axis('off') #不显示坐标轴
|
|
plt.subplot(224)
|
|
plt.imshow(imgThresh,cmap='gray')
|
|
plt.title("阈值邻域平滑滤波")
|
|
plt.axis('off') #不显示坐标轴
|
|
plt.show()
|
|
plt.savefig("ch03-29-thresh.jpg") |