5.opencv滤波器与增强

高频:图像中变化剧烈的部分。

低频:图像灰度值变化缓慢、平坦的部分。

根据高低频,可以设置高通和低通滤波器。高通滤波器可以检测变化尖锐、明显的地方,用于边缘检测低通可以让图像变得平滑,消除噪声,用于图像平滑去噪

一、方框滤波

可以用于模糊一张图片。

涉及函数:

cv2.boxFilter()

参数说明:

  • 参数1:输入图像
  • 参数2:目标图像深度
  • 参数3:核大小
  • 参数4:normalize属性,true与均值滤波相同,false很容易发生溢出【所有元素相加结果值会超过255】。
import cv2

img = cv2.imread("beauty.png", cv2.IMREAD_UNCHANGED)
# -1表示默认,(3,3)可以调整模糊程度
r = cv2.boxFilter(img, -1, (3, 3), normalize=1)
d = cv2.boxFilter(img, -1, (3, 3), normalize=0)

# cv2.WINDOW_AUTOSIZE根据图像的大小自动调整窗口的大小
cv2.namedWindow("img",cv2.WINDOW_AUTOSIZE)
cv2.namedWindow("r",cv2.WINDOW_AUTOSIZE)
cv2.namedWindow("d",cv2.WINDOW_AUTOSIZE)

cv2.imshow('img',img)
cv2.imshow('r',r)
cv2.imshow('d',d)

cv2.waitKey(0)
cv2.destroyAllWindows()

二、均值滤波

取卷积核区域内元素的均值。

涉及函数:

cv2.blur()

参数说明:

  • 参数1:输入原图
  • 参数2:kernel的大小,一般是奇数
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("beauty.png", cv2.IMREAD_UNCHANGED)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
blur = cv2.blur(img, (3, 3))

plt.subplot(1, 2, 1), plt.imshow(img), plt.title('original')
plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(blur), plt.title("blurred")

plt.savefig("./beauty_blurred.jpg")
plt.xticks([]), plt.yticks([])
plt.show()

注意:方框滤波和均值滤波对全局进行模糊,对图像造成的破坏是比较大的。

三、高斯滤波

高斯滤波的卷积核权重并不相同,中间像素点权重最高,越远离中心的像素权重越低。(2维高斯函数)

高斯滤波相比均值滤波效率更慢,但是可以有效消除高斯噪声,能保留更多的图像细节,所以经常被称为最有用的滤波器。

涉及函数:

cv2.GaussianBlur()

参数说明:

  • 参数1:原图像
  • 参数2:高斯核大小
  • 参数3:标准差。平滑时,调整标准差实际是在调整周围像素对当前像素的影响程度。调大标准差即提高了远处像素对中心像素的影响程度,滤波结果也就越平滑。
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("GaussianBlur.png", cv2.IMREAD_UNCHANGED)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

gauss = cv2.GaussianBlur(img,(3,3),7)
plt.subplot(1,2,1),plt.imshow(img),plt.title("original")
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(gauss),plt.title("gauss")
plt.xticks([]),plt.yticks([])

plt.show()

四、中值滤波

利用像素领域灰度值的中值代替该点的灰度值,中值滤波可以去除椒盐噪声和斑点噪声

涉及函数:

cv2.medianBlur()

参数说明:

  • 参数1:原图
  • 参数2:核大小
import cv2
import matplotlib.pyplot as plt

img = cv2.imread('medianBlur.png',cv2.IMREAD_UNCHANGED)  # 原图含有椒盐噪声
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
media = cv2.medianBlur(img,5)

plt.subplot(1,2,1),plt.imshow(img),plt.title("original")
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(media),plt.title("media")
plt.xticks([]),plt.yticks([])

plt.show()

五、双边滤波

具有保边去噪的功能。

涉及函数:

bilateralFilter()

参数说明:

  • 参数1:原图
  • 参数2:像素的领域直径,d
  • 参数3:灰度值相似性高斯函数标准差,sigma
  • 参数4:空间高斯函数标准差,sigma

关于2个sigma参数:简单起见,可以令2个sigma的值相等; 如果他们很小(小于10),那么滤波器几乎没有什么效果; 如果他们很大(大于150),那么滤波器的效果会很强,使图像显得非常卡通化;
关于参数d:过大的滤波器(d>5)执行效率低。 对于实时应用,建议取d=5; 对于需要过滤严重噪声的离线应用,可取d=9; d>0时,由d指定邻域直径; d<=0时,d会自动由sigmaSpace的值确定,且d与sigmaSpace成正比。

import cv2
import matplotlib.pyplot as plt
img = cv2.imread('dog.jpg',cv2.IMREAD_UNCHANGED)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

blur = cv2.bilateralFilter(img,-1,50,20)

plt.subplot(1,2,1),plt.imshow(img),plt.title('original')
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(blur),plt.title('blurred')
plt.xticks([]),plt.yticks([])
plt.show()

六、直方图均衡化

 直方图均衡化是将原图像通过某种变换,得到一幅灰度直方图为均匀分布(近均匀分布)的新图像的方法。

主要思想是:将图像中像素个数多的灰度级进行展宽,像素个数少的灰度级进行缩减。

在一定程度上可以实现清晰图像的作用。

涉及函数:

cv2.equalizeHist()

参数说明:

参数1:待均衡化图像。

案列1:针对灰度图处理。

import cv2

img = cv2.imread("cat.jpg",0)
cv2.imshow("src", img)
cv2.waitKey(0)

img_equal = cv2.equalizeHist(img)

cv2.imshow("img_equal", img_equal)
cv2.waitKey(0)
cv2.destroyAllWindows()

案例2:针对彩色图像处理。

import cv2

img = cv2.imread("cat.jpg", 1)
cv2.imshow("src", img)

# 彩色图像均衡化,需要分解通道 对每一个通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)

result = cv2.merge((bH, gH, rH))

cv2.imshow('res', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

总结:从上面可以看出,直方图均衡化可以将一张图从暗变亮。

七、Gamma变化

Gamma变换是对输入图像灰度值进行非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系。

Vout=\alpha Vin ^{\gamma}

Gamma变换用来图像增强,提升暗部细节。对漂白(相机曝光)或过暗(曝光不足)的图片,进行校正。让图像从曝光强度的线性响应变得更接近人眼感受的响应。

import cv2
import numpy as np

img = cv2.imread('cat.jpg')

def adjust_gamma(image, gamma=1.0):
    invGamma = 1.0 / gamma
    table = []
    for i in range(256):
        table.append(((i / 255.0) ** invGamma) * 255)
    table = np.array(table).astype("uint8")
    print(table)
    return cv2.LUT(image, table)

# gamma大于0和小于1的时候图像会比原图更暗
# gamma大于1的时候,图像会比原图更亮
img_gamma = adjust_gamma(img, 0.8)
# print(img_gamma)
cv2.imshow("img", img)
cv2.imshow("img_gamma", img_gamma)
cv2.waitKey(0)
cv2.destroyAllWindows()

 gamma=0.8

gamma=1.4

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值