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

家电维修 2023-07-16 19:17www.caominkang.com家电维修技术

图像去噪使用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, = img.shape[0:2]
#去噪声
for i in range(3000): #添加3000个噪声点
x=np.random.randint(0, h) #生成随机数,随机行
y=np.random.randint(0, ) #生成随机数,随机列
img[x,y,:]=255 #255为白色,生成白色噪声点
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imsho(img)
plt.axis('off')
plt.savefig("yi.jpg")
plt.sho()

效果图如下

一、均值滤波

定义均值滤波是指任意一点的像素值,都是周围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, 1 = img.shape[0:2]
# 高斯滤波
img1 = np.zeros((h1, 1, 3), dtype="uint8") #定义空白图像,用于输出中值滤波后的结果
for i in range(num, h1-num): #对扩充图像中的原图进行遍历
for j in range(num, 1-num):
sum=0
sum1=0
sum2=0
for k in range(i-num,i+num+1): #求中心像素周围sizesize区域内的像素的平均值
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/(size2) #除以核尺寸的平方
sum1 = sum1/(size2)
sum2 = sum2/(size2)
img1[i, j]=[sum,sum1,sum2] #复制给空白图像
img1=img1[(0+num):(h1-num),(0+num):(h1-num)] #从滤波图像中裁剪出原图像
return img1


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

效果如图

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

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

img需要处理的图像

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

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

代码如下

import cv2
import numpy as np
img=cv2.imread("yiyuan.jpg")
h, = img.shape[0:2]
for i in range(3000): #添加3000个噪声点
x = np.random.randint(0, h)
y = np.random.randint(0, )
img[x,y,:] = 255
#调用均值滤波函数
result=cv2.blur(img,(5,5)) #传入读取的图像和核尺寸
cv2.imsho("Noise",img)
cv2.imsho("junzhi",result)
cv2.aitKey(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, = img.shape[0:2]
#加噪声
for i in range(3000): #添加3000个噪声点
x = np.random.randint(0, h)
y = np.random.randint(0, )
img[x,y,:] = 255
#调用均值滤波函数
result=cv2.boxFilter(img, -1, (5,5), normalize=1)
result1=cv2.boxFilter(img, -1, (5,5), normalize=0)
cv2.imsho("jia zao yuan hua",img)
cv2.imsho("jun yi-opencv",result)
cv2.imsho("bu jun yi-opencv",result1)
cv2.aitKey(0)

效果图如下

三、中值滤波

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

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

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

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

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

中值滤波库函数的使用

代码如下

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

效果图如下

四、高斯滤波

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

高斯函数

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

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

        #img需要处理的图像

        #(size,size1)高斯核尺寸

        #sigmaXX方向上的高斯核标准偏差

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

OpenCV高斯滤波库函数的使用

代码如下

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

图像效果如下

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

Copyright © 2016-2025 www.jianfeikang.com 建飞家电维修 版权所有 Power by