Filtrage médian/filtrage maximum/filtrage moyen implémentation python

Question bilatérale Meituan

  

Présentez brièvement trois idées de filtrage :

Point commun : Les trois méthodes de filtrage peuvent en réalité être comprises comme des opérations de convolution, qui ne sont filtrées que pour un Filtre donné. Si la taille du noyau est maintenant de 3*3 (si les valeurs sont toutes définies sur 1), 9 cellules seront traitées. S'il n'y a pas de remplissage, il commencera par défaut à partir de la deuxième ligne.

Filtrage médian : Après multiplication élément par élément des 9 points de la zone candidate et des 9 points du filtre, le point au centre du noyau se voit attribuer la valeur médiane des 9 produits. S'il existe un noyau 3*3 (toutes les valeurs sont 1), puis après filtrage médian, la position de 5 est 18 à ce moment.

Le filtrage des valeurs maximales et moyennes signifie qu'après avoir multiplié 9 éléments élément par élément, la valeur maximale et la valeur moyenne de ces 9 valeurs sont prises.

L'idée du codage : considérant le calcul du mouvement du padding, de la foulée et de la fenêtre coulissante, en même temps, j'ai besoin de connaître plusieurs fonctions de numpy, je l'avais oublié à l'époque, ce qui était embarrassant.

import numpy as np

def median_filter(input_image,kernel,stride=1,padding=False):
    """
    中值滤波/最大滤波/均值滤波
    :param input_image: 输入图像
    :param filter_size: 滤波器大小
    :return:
    """

    # 填充(默认为1)
    padding_num = 1
    if padding:
        padding_num = int((kernel.shape[0]-1)/2)
        input_image = np.pad(input_image,(padding_num,padding_num),mode="constant",constant_values=0)

    out_image = np.copy(input_image)

    # 填充后的图像大小
    w,h = input_image.shape
    print(input_image.shape,padding_num)

    for i in range(padding_num,w-padding_num,stride):
        for j in range(padding_num,h-padding_num,stride):

            region = input_image[i-padding_num:i+padding_num+1,j-padding_num:j+padding_num+1]
            print(i,j)
            print(region.shape,kernel.shape)
            # 确保 图像提取的局部区域 与 核大小 一致
            assert (region.shape == kernel.shape)
            # 中值滤波np.median,  最大值滤波 np.maximum  均值滤波: np.mean
            out_image[i,j] = np.median(np.dot(region,kernel))



    # 裁剪原图像大小
    if padding:
        out_image = out_image[padding_num:w-padding_num,padding_num:h-padding_num]
    return out_image


if __name__ == '__main__':
    # 随机浮点数, 模仿灰度图
    input_image = np.random.rand(16,16)
    # 标准正态分布
    kernel = np.random.rand(3,3)
    print(input_image.shape,kernel.shape)
    output = median_filter(input_image,kernel)
    print(output.shape)



Je suppose que tu aimes

Origine blog.csdn.net/qq_37424778/article/details/122132822
conseillé
Classement