PythonはopenCVを使用してノイズの多い画像をフィルタリングします

openCVを使用してノイズの多い画像をフィルタリングする

平均フィルター、ボックスフィルター、ガウスフィルター、中央値フィルターを使用して、上記の5つのノイズが追加された画像をフィルター処理し、フィルターの効果を比較します。呼び出された関数は、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')

運用実績
注メディアンフィルタはnoise_img =(noise_img * 255).astype利用することができるUINT8画像データの種類を要求 ( "UINT8") 範囲[0,255](フロート(範囲[0,1])から画像データをintに変換しました)これ
はエラーに変換されないピットです!

元の7件の記事を公開 いいね8 訪問数133

おすすめ

転載: blog.csdn.net/weixin_44983848/article/details/105461190