OpenCV--Python 图像平滑之中值平滑

早过忘川 提交于 2019-12-12 12:14:02

中值平滑

原理详解

  中值平滑,类似于卷积,也是一种邻域运算,但计算的不是加权求和,而是对邻域中的像素点按灰度值进行排序,然后选择该组中的中值作为输出的灰度值。
在这里插入图片描述

  比如,取以图像的位置 (1,1)为中心的 3X3 的邻域,对邻域中的像素点灰度值按从大到小进行排序,[11,21,31,125,141,165,190,234,234][11,21,31,125,141,165,190,234,234] 可知,141是该组灰度值的中值,那么输出图像在位置(1,1)的值便为141,以此类推,得到输出图像的所有像素点的灰度值。对边界的处理可采用多种策略,而对边界进行镜像补充是较为理想的一种选择。

  中值滤波最重要的能力是去除椒盐噪声。椒盐噪声是指在图像传输系统中由于解码误差等原因,导致图像中出现孤立的白点或者黑点。

Python实现

  对于python实现的中值平滑,首先利用命令 ndarray[r1:r2+1,c1:c2+1]\mathrm{ndarray}[r_1:r_2 + 1, c_1:c_2+1] 得到 ndarray\mathrm{ndarray} 从左上角至右下角的矩形区域,然后利用Numpy\mathrm{Numpy}提供的函数median取该区域的中位数。

# -*- coding: utf-8 -*-
import random
import cv2 as cv
import numpy as np

def medianBlur(image, winSize):
    # 图像的高宽
    rows, cols = image.shape
    # 窗口的高宽均为奇数
    winH, winW = winSize
    halfWinH = (winH - 1) // 2
    halfWinW = (winW - 1) // 2
    # 中值滤波后的输出图像
    medianBlurImage = np.zeros(image.shape, image.dtype)
    for r in range(rows):
        for c in range(cols):
            # 判断边界
            rTop = 0 if r - halfWinH < 0 else r - halfWinH
            rBottom = rows - 1 if r + halfWinH > rows - 1 else r + halfWinH
            cLeft = 0 if c - halfWinW < 0 else c - halfWinW
            cRight = cols - 1 if c + halfWinW > cols - 1 else c + halfWinW
            # 取邻线
            region = image[rTop:rBottom+1, cLeft:cRight+1]
            # 求中值
            medianBlurImage[r][c] = np.median(region)
    return medianBlurImage

if __name__ == '__main__':
    image = cv.imread('img6.jpg', 0)
    cv.imshow('src', image)
    # 中值滤波
    medianBlurImage1 = medianBlur(image, (3,3))
    cv.imshow('3x3', medianBlurImage1)
    medianBlurImage2 = medianBlur(image, (15, 15))
    cv.imshow('15x15', medianBlurImage2)
    medianBlurImage3 = medianBlur(image, (25, 25))
    cv.imshow('25x25', medianBlurImage3)
    cv.waitKey(0)
    cv.destroyAllWindows()

  下图分别为添加了椒盐噪声的图像,3x3中值滤波后的图像,15x15中值滤波后的图像,25x25中值滤波后的图像。通过中值滤波去除了图像中的黑色孤立点,几乎看不到椒盐噪声的影响,并且随着中值平滑窗口的增加,椒盐噪声会完全消除。而且中值平滑后的效果并没有降低边缘的锐利程度,具有一定的保边作用。

在这里插入图片描述

OpenCV函数

dst = cv.medianBlur(src, ksize[, dst])

参数解释如下:

参数 解释
src 输入矩阵
dst 输出矩阵,其大小和数据类型与src相同
ksize 若为大于1的奇数,则窗口大小为kszie x ksize

Python示例代码

medianBlurImage = cv.medianBlur(image, 3)

总结

中值滤波适用于椒盐噪声,具有保边作用。

调用函数:dst = cv.medianBlur(src, ksize[, dst])

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!