图像基础16 图像滤波与除噪——中值滤波

来源:互联网 发布:淘宝助理官方下载免费 编辑:程序博客网 时间:2024/05/22 17:39

本文学习资源来自《机器学习实践指南》 案例应用解析
中值滤波与邻域平均法类似,但计算的是中值,而不是平均值。具体算法是:将图像的每个像素用邻域(以当前像素为中心的正方形区域)像素的中值来代替。

椒盐噪声

median

代码:

# -*- coding: utf-8 -*-#code:# 中值滤波import cv2import numpy as npfn="test.jpg"myimg = cv2.imread(fn)img = cv2.cvtColor(myimg, cv2.COLOR_BGR2GRAY)# 加上椒盐噪声# 灰价范围w = img.shape[1]h = img.shape[0]newimg = np.array(img)# 噪声点数量noisecount = 50000for k in range(0,noisecount):    xi=int(np.random.uniform(0,newimg.shape[1]))    xj=int(np.random.uniform(0,newimg.shape[0]))    newimg[xj,xi]=255# 滤波去噪# 脉冲响应函数 核函数# 图像四个边的像素处理lbimg = np.zeros((h+2,w+2),np.float32)tmpimg = np.zeros((h+2,w+2))myh=h+2myw=w+2tmpimg[1:myh-1, 1:myw-1]=newimg[0:myh, 0:myw]# 用中值法for y in range(1,myh-1):    for x in range(1,myw-1):        lbimg[y,x]=np.median(tmpimg[y-1:y+2,x-1:x+2])    print(".")resultimg = np.array(lbimg[1:myh-1,1:myw-1],np.uint8)cv2.imshow('src',newimg)cv2.imshow('dst',resultimg)cv2.waitKey()cv2.destroyAllWindows()

这里写图片描述

结果:
这里写图片描述

也可以使用medianBlur函数实现中值滤波:

cv2.medianBlur(src, ksize[, dst]) -> dst

medianBlur

# -*- coding: utf-8 -*-#code:# 中值滤波import cv2import numpy as npfn="test.jpg"myimg = cv2.imread(fn)img = cv2.cvtColor(myimg, cv2.COLOR_BGR2GRAY)# 加上椒盐噪声# 灰价范围w = img.shape[1]h = img.shape[0]newimg = np.array(img)# 噪声点数量noisecount = 50000for k in range(0,noisecount):    xi=int(np.random.uniform(0,newimg.shape[1]))    xj=int(np.random.uniform(0,newimg.shape[0]))    newimg[xj,xi]=255# 滤波去噪# 脉冲响应函数 核函数# 图像四个边的像素处理lbimg = cv2.medianBlur(newimg, 3)cv2.imshow('src',newimg)cv2.imshow('dst',lbimg)cv2.waitKey()cv2.destroyAllWindows()

高斯噪声

import cv2import numpy as np fn = "test.jpg"myimg = cv2.imread(fn)img = cv2.cvtColor(myimg , cv2.COLOR_BGR2GRAY)# 加上高斯噪声param = 20# 灰阶范围grayscale = 256w = img.shape[1]h = img.shape[0]newimg = np.zeros((h,w),np.uint8)# 加上高斯噪声param=20# 灰阶范围grayscale=256w=img.shape[1]h=img.shape[0]newimg=np.zeros((h,w),np.uint8)for x in range(0,h):    for y in range(0,w,2):        r1 = np.random.random_sample()        r2 = np.random.random_sample()        z1=param*np.cos(2*np.pi*r2)*np.sqrt((-2)*np.log(r1))        z2=param*np.sin(2*np.pi*r2)*np.sqrt((-2)*np.log(r1))        fxy=int(img[x,y]+z1)        fxy1 = int(img[x,y+1]+z2)        #f(x,y)        if fxy<0:            fxy_val=0        elif fxy>grayscale-1:            fxy_val=grayscale-1        else:            fxy_val=fxy        #f(x,y+1)        if fxy1<0:            fxy1_val=0        elif fxy1>grayscale-1:            fxy1_val=grayscale-1        else:            fxy1_val=fxy1        newimg[x,y]=fxy_val        newimg[x,y+1]=fxy1_val    print("-")# 滤波去噪lbimg = cv2.medianBlur(newimg, 3)cv2.imshow('src', newimg)cv2.imshow('dst',lbimg)cv2.waitKey()cv2.destroyAllWindows()

这里写图片描述
结果:
这里写图片描述

原创粉丝点击