学习笔记-使用Python对含有椒盐噪声的图像进行均值滤波,高斯滤波和中值滤波

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,对自备图片利用二维高斯模板,对其进行加权平滑滤波,并比较其效果;二维高斯模板为:

学习笔记-使用Python对含有椒盐噪声的图像进行均值滤波,高斯滤波和中值滤波 

 3,对自备图像之一添加椒盐噪声,再进行中值滤波;

上一篇:【图像去噪】基于matlab GUI中值+小波+维纳+滤波器图像去噪【含Matlab源码 616期】


下一篇:面试题5:替换空格