OpenCV学习记录(二 图像去噪、四种滤波方式)

图像去噪:使用OpenCV对图像进行处理,考虑对图像进行去除噪声点,通过不同方法。

OpenCV对于图像去噪(又称图像平滑)提供了四种方法,分别是均值滤波、方框滤波、中值滤波和高斯滤波。

图片去噪处理一般是在图像灰度化之后,图像灰度化之后,会存在噪声点,这些噪声点不是我们所需要的,因此需要图像去噪技术。

要想去除图片的噪声,需要一张有噪声的图片,下面代码为图片添加噪声:

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
img = cv2.imread("yiyuan.jpg")
h, w = img.shape[0:2]
#去噪声
for i in range(3000): #添加3000个噪声点
x=np.random.randint(0, h) #生成随机数,随机行
y=np.random.randint(0, w) #生成随机数,随机列
img[x,y,:]=255 #255为白色,生成白色噪声点
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.axis('off')
plt.savefig("yi.jpg")
plt.show()

效果图如下:

一、均值滤波

定义:均值滤波是指任意一点的像素值,都是周围NM个像素值的均值。

均值滤波函数:

import cv2
import numpy as np
def junzhi(img,size): #img输入,size均值滤波器的尺寸,>=3,且必须为奇数
num = int((size - 1) / 2) # 输入图像需要填充的尺寸
img = cv2.copyMakeBorder(img, num, num, num, num, cv2.BORDER_REPLICATE) #对传入的图像进行扩充,尺寸为num
h1, w1 = img.shape[0:2]
# 高斯滤波
img1 = np.zeros((h1, w1, 3), dtype="uint8") #定义空白图像,用于输出中值滤波后的结果
for i in range(num, h1-num): #对扩充图像中的原图进行遍历
for j in range(num, w1-num):
sum=0
sum1=0
sum2=0
for k in range(i-num,i+num+1): #求中心像素周围size*size区域内的像素的平均值
for l in range(j-num,j+num+1):
sum=sum+img[k,l][0]
sum1=sum1+img[k,l][1]
sum2=sum2+img[k,l][2]
sum=sum/(size**2) #除以核尺寸的平方
sum1 = sum1/(size**2)
sum2 = sum2/(size**2)
img1[i, j]=[sum,sum1,sum2] #复制给空白图像
img1=img1[(0+num):(h1-num),(0+num):(h1-num)] #从滤波图像中裁剪出原图像
return img1


img=cv2.imread("yiyuan.jpg")
h, w = img.shape[0:2]
#加噪声
for i in range(3000): #添加3000个噪声点
x = np.random.randint(0, h)
y = np.random.randint(0, w)
img[x,y,:] = 255
#调用均值滤波函数
result=junzhi(img,5) #传入读取的图像和核尺寸
cv2.imshow("zaosheng",img)
cv2.imshow("junzhi",result)
cv2.waitKey(0)

效果如图:

OpenCV中均值滤波函数库函数的使用:

函数:cv2.blur(img,(size,size1))

img:需要处理的图像

(size,size1):表示核大小,是以(宽度,高度)表示的元祖形式。

使用库函数进行均值滤波图像处理,效果如下:

代码如下:

import cv2
import numpy as np
img=cv2.imread("yiyuan.jpg")
h, w = img.shape[0:2]
for i in range(3000): #添加3000个噪声点
x = np.random.randint(0, h)
y = np.random.randint(0, w)
img[x,y,:] = 255
#调用均值滤波函数
result=cv2.blur(img,(5,5)) #传入读取的图像和核尺寸
cv2.imshow("Noise",img)
cv2.imshow("junzhi",result)
cv2.waitKey(0)

二、方框滤波

原理:方框滤波与均值滤波原理相同,是指任意一点的像素值,都是周围NM个像素值的均值。但是方框滤波需要均一化处理,如果不做均一化处理,容易产生溢出,溢出的像素值为255,即为白色。均一化处理的参数为布尔型变量normalize,当normalize=Ture时,表示需要均一化处理,normalize=Flase时,不需要均一化处理。

数学原理:

函数原型:result=cv2.boxFilter(img,deep,(size,size1),normalize)

#img:原始图像,需要进行处理的图片

#deep:原始图像深度

#(size,size1):核尺寸

#normalize:归一化参数,normalize=1进行归一化处理,normalize=0不进行归一化处理。

使用方框滤波库函数处理图像

代码如下:

import cv2
import numpy as np
img=cv2.imread("jiesi.jpg")
h, w = img.shape[0:2]
#加噪声
for i in range(3000): #添加3000个噪声点
x = np.random.randint(0, h)
y = np.random.randint(0, w)
img[x,y,:] = 255
#调用均值滤波函数
result=cv2.boxFilter(img, -1, (5,5), normalize=1)
result1=cv2.boxFilter(img, -1, (5,5), normalize=0)
cv2.imshow("jia zao yuan hua",img)
cv2.imshow("jun yi-opencv",result)
cv2.imshow("bu jun yi-opencv",result1)
cv2.waitKey(0)

效果图如下:

三、中值滤波

原理:选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。

换成图像模板来理解就是将临近像素按照大小排列,取排序像素中位于中间位置的值作为中值滤波的像素值。

函数原型:result=cv2.medianBlur(img,size)

#img:需要进行中值滤波处理的图像

#size:核大小,必须是大于1的奇数。

中值滤波库函数的使用

代码如下:

import cv2
import numpy as np
img=cv2.imread("yiyuan.jpg")
h, w = img.shape[0:2]
for i in range(3000): #添加3000个噪声点
x = np.random.randint(0, h)
y = np.random.randint(0, w)
img[x,y,:] = 255
#调用OpenCV库函数中的均值滤波函数
result=cv2.medianBlur(img, 5) #核尺寸是大于1的奇数
cv2.imshow("yuan tu",img)
cv2.imshow("zhong zhi-opencv",result)
cv2.waitKey(0)

效果图如下:

四、高斯滤波

原理:高斯平滑也是邻域平均的思想对图像进行平滑的一种方式,在图像高斯平滑中,不同位置的像素被赋予了不同的权重

高斯函数:

OpenCV中高斯滤波库函数的使用:

函数原型:result=cv2.GaussianBlur(img,(size,size1),sigmaX,sigmaY)

        #img:需要处理的图像

        #(size,size1):高斯核尺寸

        #sigmaX:X方向上的高斯核标准偏差

        #sigmaY:Y方向上的高斯核标准偏差;如果sigmaY为零,则将其设置为等于sigmaX;如果两个sigma都为零,则分别从ksize.width和ksize.height计算得出;为了完全控制结果,建议指定所有ksize,sigmaX和sigmaY。核大小(size,size)必须是奇数,X方向方差主要控制权重。

OpenCV高斯滤波库函数的使用:

代码如下:

import cv2
import numpy as np
img=cv2.imread("jiesi.jpg")
h, w = img.shape[0:2]
for i in range(3000):    #添加3000个噪声点
    x = np.random.randint(0, h)
    y = np.random.randint(0, w)
    img[x,y,:] = 255
#调用OpenCV库函数中的高斯滤波函数
result=cv2.GaussianBlur(img,(5,5),1,1) #传入读取的图像和核尺寸 (5,5)必须是奇数
cv2.imshow("yuantu",img)
cv2.imshow("gaosi-opencv",result)
cv2.waitKey(0)

图像效果如下:

 高斯滤波实质上是一种信号的滤波器,大多数图像使用高斯滤波器会得到信噪比SNR较高的图像(反应真实信号)。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。

  • 10
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值