首先解答上一篇文章Python使用标准库subprocess调用外部程序中的问题,该题答案为['1', '2', '3', '4'],在正则表达式中,问号(?)有两种含义,一种是表示前面的字符或模式可有可无,在就是跟在*、+、{m,n}等后面表示非贪心匹配模式,也就是匹配尽可能短的内容。因此,该题中正则表达式作为re.findall()函数参数时的功能为:查找字符串中所有的数字字符。

-------------分割线-------------

中值滤波是数字信号处理和数字图像处理领域使用较多的预处理技术,使用邻域内所有信号的中位数替换中心像素的值,可以在滤除异常值的情况下较好地保留纹理信息。该技术会在一定程度上造成图像模糊和失真,滤波窗口变大时会非常明显。

import numpy as np
from PIL import Image
import scipy.signal as signal
im = Image.open('lena.jpg')
data = []
width, height = im.size
# 读取图像像素值
for h in range(height):
    row = []
    for w in range(width):
        value = im.getpixel((w,h))
        row.append(value)
    data.append(row)
# 二维中值滤波
data = np.float32(data)
# 滤波窗口的大小会对结果产生很大影响
data = signal.medfilt2d(data, (3,3))
# 创建并保存结果图像
for h in range(height):
    for w in range(width):
        im.putpixel((w,h), int(data[h][w]))
im.save('result.jpg')

原始图像:

使用Python对图像进行中值滤波_webgl

滤波窗口为(3,3)时的结果:

使用Python对图像进行中值滤波_epoll_02

滤波窗口为(5,5)时的结果:

使用Python对图像进行中值滤波_python_03

滤波窗口为(11,11)时的结果:

使用Python对图像进行中值滤波_信号处理_04

------------分割线--------------