import numpy as npimport cv2from copy import deepcopyfrom PIL import Imagefrom matplotlib import pyplot as plt"""制作噪声图像"""def add_salt_noise(img, snr=0.5):    SNR = snr  # 指定信噪比(默认0.5)    size = img.size  # 获取总共像素个数    # print(type(size))    noiseSize = int(size * (1 - SNR))    for i in range(0, noiseSize):        # 随机获取 某个点        xi = int(np.random.uniform(0, img.shape[1]))        xj = int(np.random.uniform(0, img.shape[0]))        if img.ndim == 2:  # 判断是否为2维图像(即灰度图像)            img[xj, xi] = 0  # 设置值为黑点        elif img.ndim == 3:            img[xj, xi] = 0  # 设置值为黑点,也能够设置为红色255    return img"""黑白图中值滤波"""def median_Blur(img, filiter_size=3):  # 当输出的图像为彩色图像    image_copy = np.array(img, copy=True).astype(np.float32)    processed = np.zeros_like(image_copy)    middle = int(filiter_size / 2)    r = np.zeros(filiter_size * filiter_size)    g = np.zeros(filiter_size * filiter_size)    b = np.zeros(filiter_size * filiter_size)    for i in range(middle, image_copy.shape[0] - middle):        for j in range(middle, image_copy.shape[1] - middle):            count = 0            # 顺次取出模板中对应的像素值            for m in range(i - middle, i + middle + 1):                for n in range(j - middle, j + middle + 1):                    r[count] = image_copy[m][n][0]                    g[count] = image_copy[m][n][1]                    b[count] = image_copy[m][n][2]                    count += 1            r.sort()            g.sort()            b.sort()            processed[i][j][0] = r[int(filiter_size * filiter_size / 2)]            processed[i][j][1] = g[int(filiter_size * filiter_size / 2)]            processed[i][j][2] = b[int(filiter_size * filiter_size / 2)]    processed = np.clip(processed, 0, 255).astype(np.uint8)    return processed"""灰度图中值滤波"""def median_Blur_gray(img, filiter_size=3):  # 当输出的图像为灰度图像    image_copy = np.array(img, copy=True).astype(np.float32)    processed = np.zeros_like(image_copy)    middle = int(filiter_size / 2)    for i in range(middle, image_copy.shape[0] - middle):        for j in range(middle, image_copy.shape[1] - middle):            temp = []            for m in range(i - middle, i + middle + 1):                for n in range(j - middle, j + middle + 1):                    if m - middle < 0 or m + middle + 1 > image_copy.shape[0] or n - middle < 0 or n + middle + 1 > \                            image_copy.shape[1]:                        temp.append(0)                    else:                        temp.append(image_copy[m][n])                    # count += 1            temp.sort()            processed[i][j] = temp[(int(filiter_size * filiter_size / 2) + 1)]    processed = np.clip(processed, 0, 255).astype(np.uint8)    return processedif __name__ == "__main__":    img = input("Please input name of image:")  # 默认是string类型    img = cv2.imread(img)    print("img.shape:", img.shape)    # plt.imshow显示cv2.imread读取的图像蓝与红有区别    b, g, r = cv2.split(img)    src_img = cv2.merge([r, g, b])    img_demo = deepcopy(src_img)    #使得两图像不烦扰    snr = float(input("Please input signal noise ratio:"))    img_salt = add_salt_noise(img_demo, snr)    filiter_size = int(input("Please input size of filiter:"))    median_blur = median_Blur(img_salt, filiter_size)    plt.figure("Image processing---MedianBlur")  # 图像窗口名称    plt.subplot(1, 3, 1)    plt.imshow(src_img)    plt.axis('off')  # 关掉坐标轴    plt.title("src_img")    plt.subplot(1, 3, 2)    plt.imshow(img_salt)    plt.axis('off')  # 关掉坐标轴    plt.title("img_salt")    plt.subplot(1, 3, 3)    plt.imshow(median_blur)    plt.axis('off')  # 关掉坐标轴    plt.title("median_blur")    plt.tight_layout()  # 调整整体空白    plt.subplots_adjust(left=None, bottom=None, right=None, top=None,                        wspace=None, hspace=None)  # 调整子图间距    plt.savefig("reult.png", dpi=1000)    plt.show()

信噪比为0.5,卷积核为3,进行中值滤波失去了这样的比照图:

信噪比为0.9,卷积核为3,进行中值滤波失去了这样的比照图: