python中值滤波器_python中值滤波

中值滤波1

import numpy as np

import cv2

from PIL import Image

import scipy.signal as signal

import matplotlib.pyplot as plt

# 创建一个500*500的矩阵

input_images = np.zeros((500, 500))

filename = "E:/pycharm/GraduationDesign/Test/testtwo.png"

# convert将当前图像转换为灰度模式,并且返回新的图像。

# 将图片在重新定义的矩阵中再显示,不然可能会只显示部分。

img = Image.open(filename).resize((500, 500)).convert('L')

plt.subplot(221)

plt.title('原图', fontproperties=font_set)

plt.imshow(img)

# 图像的尺寸,按照像素数计算。它的返回值为宽度和高度的二元组(width, height)。

width = img.size[0]

height = img.size[1]

threshold = 130

# 可以改写代码使其成为二值化,此代码可理解为反向二值化

for h in range(height):

for w in range(width):

# getpixel直接获得(h,w)处的像素直接返回这个点三个通道的像素值

# 返回给定位置的像素值。如果图像为多通道,则返回一个元组(r,g,b,阈值)。

# 如果改成(w,h)出现的图像会倒转

if img.getpixel((w, h)) < threshold:

input_images[h, w] = 1

else:

input_images[h, w] = 0

plt.subplot(222)

plt.title('二值化', fontproperties=font_set)

plt.imshow(input_images)

data = signal.medfilt2d(np.array(img), kernel_size=3) # 二维中值滤波

for h in range(0, height):

for w in range(0, width):

if data[h][w] < 128:

input_images[h, w] = 0

else:

input_images[h, w] = 1

plt.subplot(223)

plt.title('中值滤波去噪(3*3)', fontproperties=font_set)

plt.imshow(input_images)

data = signal.medfilt2d(np.array(img), kernel_size=7) # 二维中值滤波

for h in range(0, height):

for w in range(0, width):

if data[h][w] < 128:

input_images[h, w] = 0

else:

input_images[h, w] = 1

plt.subplot(224)

plt.title('中值滤波去噪(7*7)', fontproperties=font_set)

plt.imshow(input_images)

plt.show()

中值滤波2

from PIL import Image

import numpy as np

def MedianFilter(src, dst, k=3, padding=None):

imarray = np.array(Image.open(src))

height, width = imarray.shape

if not padding:

edge = int((k - 1) / 2)

if height - 1 - edge <= edge or width - 1 - edge <= edge:

print("The parameter k is to large.")

return None

new_arr = np.zeros((height, width), dtype="uint8")

for i in range(height):

for j in range(width):

if i <= edge - 1 or i >= height - 1 - edge or j <= edge - 1 or j >= height - edge - 1:

new_arr[i, j] = imarray[i, j]

else:

# nm:neighbour matrix

nm = imarray[i - edge:i + edge + 1, j - edge:j + edge + 1]

max = np.max(nm)

min = np.min(nm)

if imarray[i, j] == max or imarray[i, j] == min:

new_arr[i, j] = np.median(nm)

else:

new_arr[i, j] = imarray[i, j]

new_im = Image.fromarray(new_arr)

new_im.save(dst)

src = "E:/正课/大二上/计算机网络/网络编程/图像去噪声/output2/4.jpg"

dst = "E:/正课/大二上/计算机网络/网络编程/图像去噪声/output2/xxx.jpg"

MedianFilter(src, dst)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值