OpenCV-python 实现图像的序统计滤波

本文深入探讨了图像处理中的最大值滤波和最小值滤波技术,通过Python代码实现并展示了滤波效果。理解这些技术如何平滑图像,去除噪声,以及在图像分析中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import cv2
import matplotlib.pyplot as plt
import math


def max_filter(image, ksize=3):
    '''
    最大值滤波函数
    :param image:输入图像
    :param ksize:模板尺寸
    :return:滤波结果图像
        '''
    border_width = int((ksize-1)/2)  #边界填充宽度
    #填充边界操作
    border_filling = cv2.copyMakeBorder(image, border_width, border_width,
                                       border_width, border_width, cv2.BORDER_REPLICATE)
    #从[(ksize-1)/2][(ksize-1)/2]开始向右下角进行漫游重合,
    #到[borderFilling.shape[1]-3][borderFilling.shape[0]-3]停止
    max_image = image.copy()
    for i in range(border_width, border_filling.shape[0]-border_width):
        for j in range(border_width, border_filling.shape[1]-border_width):
            #读取模板下像素的灰度值
            list = []
            for s in range(i-border_width, i+border_width+1):
                for t in range(j-border_width, j+border_width+1):
                    list.append(border_filling[s][t])
            #选最大值作为输出图像模板中心像素的灰度值
            max_image[i-border_width][j-border_width] = max(list)
    return max_image


def min_filter(image, ksize = 3):
    '''
    最小值滤波函数
    :param image:输入图像
    :param ksize:模板尺寸
    :return:滤波结果图像
    '''
    border_width = int((ksize-1)/2)  #边界填充宽度
    #填充边界操作
    border_filling = cv2.copyMakeBorder(image, border_width, border_width,
                                       border_width, border_width, cv2.BORDER_REPLICATE)
    #从[(ksize-1)/2, (ksize-1)/2]开始向右下角进行漫游重合,
    #到[borderFilling.shape[0]-3, borderFilling.shape[1]-3]停止
    minImage = image.copy()
    for i in range(border_width, border_filling.shape[0]-border_width):
        for j in range(border_width, border_filling.shape[1]-border_width):
            #读取模板下像素的灰度值
            list = []
            for s in range(i-border_width, i+border_width+1):
                for t in range(j-border_width, j+border_width+1):
                    list.append(border_filling[s][t])
            #选最大值作为输出图像模板中心像素的灰度值
            minImage[i-border_width][j-border_width] = min(list)
    return minImage

#显示函数
def showImages(images):
    for i in range(len(images)):
        img = images[i]
        #行,列,索引
        x = 2
        plt.subplot(x, math.ceil(len(images)/x), i+1)
        plt.imshow(img, cmap="gray")
        title = "("+str(i+1)+")"
        plt.title(title,fontsize=10)
        plt.xticks([])
        plt.yticks([])
    plt.show()


if __name__ == "__main__":
    image = cv2.imread("images\\flower8.jpg", 0)
    maxFilter1 = max_filter(image, 3)
    maxFilter2 = max_filter(maxFilter1, 3)
    maxFilter3 = max_filter(maxFilter2, 3)
    minFilter1 = min_filter(image, 3)
    minFilter2 = min_filter(minFilter1, 3)
    minFilter3 = min_filter(minFilter2, 3)
    images = [image, maxFilter1, maxFilter2, maxFilter3, image, minFilter1, minFilter2, minFilter3]
    showImages(images)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值