OpenCV(python)一键入门--第7篇(图像噪声与降噪)

举报
拓佑豪 发表于 2021/07/21 23:17:38 2021/07/21
【摘要】 图像噪声与降噪

1:图像噪声

图像噪声产生的原因会有很多种,有可能是设备为题,或者数字信号在传输过程中受到干扰。常见的噪声分以下几种:

1):均匀分布噪声
因为某一些规律性的错误导致
2):椒盐噪声
是一种随机在图像中出现的稀疏像素点
3):高斯噪声
一般在数码相机的图像采集过程中产生

import cv2 as cv
import numpy as np
#图像噪声

def add_salt_pepper_noise(image):
    h, w = image.shape[:2]
    nums = 10000
    rows = np.random.randint(0, h, nums, dtype=np.int)
    cols = np.random.randint(0, w, nums, dtype=np.int)
    for i in range(nums):
        if i % 2 == 1:
            image[rows[i], cols[i]] = (255, 255, 255)
        else:
            image[rows[i], cols[i]] = (0, 0, 0)
    cv.imshow("salt pepper noise", copy)
    return image

def gaussian_noise(image):
    noise = np.zeros(image.shape, image.dtype)
    m = (15, 15, 15)
    s = (30, 30, 30)
    cv.randn(noise, m, s)
    dst = cv.add(image, noise)
    cv.imshow("gaussian noise", dst)
    return dst

src = cv.imread("ma.jpg")
h, w = src.shape[:2]
gaussian_noise(src)
add_salt_pepper_noise(src)

cv.waitKey(0)
cv.destroyAllWindows()

原图为:

椒盐噪声:

高斯噪声:


2:图像去噪

该算法使用自然图像中普遍存在的冗余信息来去噪声。与常用的双线性滤波、中值滤波等利用图像局部信息来滤波不同的是,它利用了整幅图像来进行去噪,以图像块为单位在图像中寻找相似区域,再对这些区域求平均,能够比较好地去掉图像中存在的高斯噪声。与我们以前学习的平滑技术相比这种算法要消耗更多的时间,但是结果很好。对于彩色图像,要先转换到 CIELAB 颜色空间,然后对 L 和 AB 成分分别去噪。

在上述代码中加入如下语句即可

result = cv.fastNlMeansDenoisingColored(src, None, 15, 15, 10, 30)
cv.imshow("result", result)

其效果如下:

函数原型为:

fastNlMeansDenoisingColored( InputArray src, OutputArray dst,
                            float h, float hColor,
                            int templateWindowSize , int searchWindowSize)

共同的参数有如下
• h : 决定过滤器强度。h 值高可以很好的去除噪声,但也会把图像的细节抹去。
• hForColorComponents : 与 h 相同,但使用与彩色图像。
• templateWindowSize : 奇数。
• searchWindowSize : 奇数。

去噪函数补充:

#非局部平均去噪
#cv2.fastNlMeansDenoising() - 使用单个灰度图像
#cv2.fastNlMeansDenoisingColored() - 使用彩色图像。
#cv2.fastNlMeansDenoisingMulti() - 用于在短时间内捕获的图像序列(灰度图像)
#cv2.fastNlMeansDenoisingColoredMulti() - 与上面相同,但用于彩色图像。

当然,也可以使用如下代码进行降噪:

result1 = cv.blur(src, (5, 5))  #图像均值
cv.imshow("result-1", result1)

result2 = cv.GaussianBlur(src, (5, 5), 0)  #高斯模糊
cv.imshow("result-2", result2)

result3 = cv.medianBlur(src, 5)  #中值滤波
cv.imshow("result-3", result3)

关于图像模糊,可以参考OpenCV(python)第六篇(图像卷积与模糊):https://bbs.huaweicloud.com/blogs/285595


参考文章:https://blog.csdn.net/qq_38410428/article/details/93046099

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。