Python uses openCV to filter noisy images

Use openCV to filter the noisy image

Use the mean filter, box filter, Gaussian filter, and median filter to filter the above five noise-added images, and compare the effects of the filter. The called function can refer to: cv2.blur (), cv2. boxFilter (), cv2.GaussianBlur (), cv2.medianBlur ()
"""
# @Time    :  2020/4/11 
# @Author  :  JMChen
"""
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
from skimage.util import random_noise


def savefig(fig, plt, filename, width, height):
    # 设置字体为SimHei显示中文
    plt.rcParams['font.family'] = ['sans-serif']
    plt.rcParams['font.sans-serif'] = ['SimHei']
    fig.set_size_inches(width / 300, height / 300)
    # 加水印
    fig.text(0.65, 0.45, '2018xxxxxxxx_XXX', fontsize=25, rotation=10, color='red', ha='right', va='bottom', alpha=0.5)
    # 删除坐标轴的刻度显示
    plt.gca().xaxis.set_major_locator(plt.NullLocator())
    plt.gca().yaxis.set_major_locator(plt.NullLocator())
    # 调整子图
    plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
    plt.margins(0, 0)
    fig.savefig(filename, format='png', transparent=True, dpi=300, pad_inches=0)


def dealFit(noise_img, title_str, savename):
    img = cv.imread('lena.png', cv.IMREAD_GRAYSCALE)

    r = 2
    c = 3

    f = plt.figure(figsize=(c * img.shape[1] / 200, r * 1.1 * img.shape[0] / 200), dpi=300)
    f.add_subplot(r, c, 1)
    plt.title('original')
    plt.imshow(img, cmap='gray')
    plt.axis('off')

    f.add_subplot(r, c, 2)
    plt.imshow(noise_img, cmap='gray')
    plt.title(title_str)
    plt.axis('off')

    f.add_subplot(r, c, 3)
    blur = cv.blur(noise_img, (5, 5))
    plt.imshow(blur, cmap='gray')
    plt.title('average filter')
    plt.axis('off')

    f.add_subplot(r, c, 4)
    blur = cv.boxFilter(noise_img, -1, (5, 5), normalize=False)
    plt.imshow(blur, cmap='gray')
    plt.title('box filter')
    plt.axis('off')

    f.add_subplot(r, c, 5)
    blur = cv.GaussianBlur(noise_img, (5, 5), 0)
    plt.imshow(blur, cmap='gray')
    plt.title('gaussian filter')
    plt.axis('off')

    f.add_subplot(r, c, 6)
    noise_img = (noise_img * 255).astype("uint8")
    blur = cv.medianBlur(noise_img, 5)
    plt.imshow(blur, cmap='gray')
    plt.title('media filter')
    plt.axis('off')

    plt.show()
    savefig(f, plt, savename, 2048, 1400)


img = cv.imread('lena.png', cv.IMREAD_GRAYSCALE)

noise_img = random_noise(img, mode='gaussian', seed=None, clip=True)
dealFit(noise_img, 'gaussian noise', 'task3b1.png')

noise_img = random_noise(img, mode='salt', amount=0.1)
dealFit(noise_img, 'salt noise', 'task3b2.png')

noise_img = random_noise(img, mode='pepper', amount=0.1)
dealFit(noise_img, 'pepper noise', 'task3b3.png')

noise_img = random_noise(img, mode='s&p', amount=0.1)
dealFit(noise_img, 'salt and pepper noise', 'task3b4.png')

noise_img = random_noise(img, mode='speckle')
dealFit(noise_img, 'speckle noise', 'task3b5.png')

operation result
Note median filter requires uint8 image data types may be utilized noise_img = (noise_img * 255) .astype ( "uint8") image data from the float (the range [0,1]) converted to int (range [0,255] )
Here is a pit that does not translate into an error! ! !

YES
Published 7 original articles · Like 8 · Visits 133

Guess you like

Origin blog.csdn.net/weixin_44983848/article/details/105461190