中值平滑
原理详解
中值平滑,类似于卷积,也是一种邻域运算,但计算的不是加权求和,而是对邻域中的像素点按灰度值进行排序,然后选择该组中的中值作为输出的灰度值。
比如,取以图像的位置 (1,1)为中心的 3X3 的邻域,对邻域中的像素点灰度值按从大到小进行排序, 可知,141是该组灰度值的中值,那么输出图像在位置(1,1)的值便为141,以此类推,得到输出图像的所有像素点的灰度值。对边界的处理可采用多种策略,而对边界进行镜像补充是较为理想的一种选择。
中值滤波最重要的能力是去除椒盐噪声。椒盐噪声是指在图像传输系统中由于解码误差等原因,导致图像中出现孤立的白点或者黑点。
Python实现
对于python实现的中值平滑,首先利用命令 得到 从左上角至右下角的矩形区域,然后利用提供的函数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])
来源:CSDN
作者:CharlesWu123
链接:https://blog.csdn.net/m0_38007695/article/details/103485046