import cv2 as cv
from pylab import *
from scipy import ndimage
import matplotlib.pyplot as plt
import random
# .......................................................................................
# ..................................我是分界线.............................................
# .......................................................................................
def pepper_and_salt(img,percentage): # 第一个参量为输入图片路径,第二个是噪声占图片像素的百分比
num = int(percentage*img.shape[0]*img.shape[1]) # 计算椒盐噪声点数量
random.randint(0, img.shape[0]) # 参数1、参数2必须是整数函数;返回值是参数1和参数2之间的任意整数生成随机位置
img2 = img.copy() # 浅度复制,复制的数不会随着被复制数的嵌套序列的元素的改变而改变;
for i in range(num):
X=random.randint(0,img2.shape[0]-1) # 从0到图像长度之间的一个随机整数,因为是闭区间所以-1
Y=random.randint(0,img2.shape[1]-1)
if random.randint(0,1) ==0: # 黑白色概率55开
img2[X,Y] = (255,255,255) # 白色
else:
img2[X,Y] =(0,0,0) # 黑色
return img2
# ..................................我是分界线.............................................
if __name__ == '__main__':
#对自备图片进行均值滤波
plt.ion()
# 读取图片
img = cv.imread("g07.tif") # pycharm文件和图片在同一个文件夹里,故可直接写图片名称来表示路径
# 加入噪音
img = pepper_and_salt(img, 0.01)
source = cv.cvtColor(img, cv.COLOR_BGR2RGB) # 颜色空间转换函数
# 均值滤波
result = cv.blur(source, (5, 5)) # 以周围5x5的像素值为依据进行滤波,越大越模糊
# 显示图形
titles = ['Source Image', 'Blur Image']
images = [source, result]
for i in range(2): # 将两个图合并为一个图输出
plt.subplot(1, 2, i + 1) # plt.subplot(i,j,n)形式,其中ij是行列数,n是第几个图
plt.imshow(images[i]) # 对图像进行处理,并显示其格式,
plt.title(titles[i]) # 设置图像标题
plt.xticks([]), plt.yticks([])
plt.show() # plt.show则是将plt.imshow处理后的函数显示出来
plt.pause(3) # 该句显示图片3秒
plt.close() # 清空窗口
# 高斯模糊模板
kernel_3X3 = np.array([ # 产生二维数组
[1/16, 2/16, 1/16],
[2/16, 4/16, 2/16],
[1/16, 2/16, 1/16],
])
gray = cv.cvtColor(source, cv.COLOR_BGR2GRAY) # 将彩色图片变为灰度图
kernel_3X3 = kernel_3X3/kernel_3X3.sum() # .sum()是对序列进行求和,在这里这段代码无意义
k = ndimage.convolve(gray, kernel_3X3, mode='constant', cval=0.0) # 卷积
# ndimage.convolve()第一个参数表示输入的一维数组,第二个参数是输入的二维数组
# mode='reflect'(默认值),外部值会反映在输入的边以填充缺失值。
# mode='constant', cval=0.0表示边界补0;mode='constant', cval=1.0表示边界补1
cv.imshow("Gaussian Blur ", k) # 图片显示
cv.waitKey(5000)
cv.destroyAllWindows()
#添加椒盐噪声
img = cv.imread("g07.tif")
img1 = pepper_and_salt(img, 0.05) # 百分之5的椒盐噪音
img_median = cv.medianBlur(img1, 3) # 中值滤波
htitch = np.hstack((img1, img_median)) # 将添加噪声的图和中值滤波后的图合并到一起显示
cv.imshow("pepper_and_salt", htitch)
cv.waitKey(5000)
cv.destroyAllWindows()
二、图象平滑
1,对自备图片(封面图图)进行均值滤波(自选模板大小)
2,对自备图片利用二维高斯模板,对其进行加权平滑滤波,并比较其效果;二维高斯模板为:
3,对自备图像之一添加椒盐噪声,再进行中值滤波;