欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图像处理基础学习(三)

程序员文章站 2022-03-20 23:29:39
...

图像处理基础学习(三)

【task3(4天)】滤波操作(提交代码和效果对比图)

一、学习了解线性滤波的基本原理
二、练习实现均值滤波和高斯滤波
三、学习了解非线性滤波的原理
四、练习实现中值滤波和双边滤波

一、学习了解线性滤波的基本原理

(一)、基本知识
1.图像滤波:指尽量在保存图像细节特征的条件下对目标图像的噪声进行抑制。
2.图像滤波的目的:一是抽出对象的特征作为图像识别的特征模式;二是消除图像中混入的噪声。
3.图像滤波的要求:一是不能损坏图像的轮廓及边缘等重要信息;二是使图像清晰视觉效果好。
4.滤波和模糊的区别:拿高斯滤波来举例:滤波一般可以分为高通滤波和低通滤波,对于高斯低通滤波就会产生模糊效果,如果对于高斯高通滤波就会产生锐化的效果。所以通常是:高斯滤波就是指使用高斯函数进行滤波;高斯模糊就是指低通滤波。
5.线性过滤器:即两个信号之和的响应和它们各自响应之和相等,换句话说,每个像素的输出值是一些输入像素的加权和,使用乘积和的计算,例如:R = w1z1 + w2z2 + … + wnzn
高通:边缘增强、边缘提取
低通:钝化图像、去除噪音
带通:删除特定频率、增强中很少用

过滤是信号和图像处理中基本的任务。其目的是根据应用环境的不同,选择性的提取图像中某些认为是重要的信息。过滤可以移除图像中的噪音、提取感兴趣的可视特征、允许图像重采样等等。频域分析将图像分成从低频到高频的不同部分。低频对应图像强度变化小的区域,而高频是图像强度变化非常大的区域。在频率分析领域的框架中,滤波器是一个用来增强图像中某个波段或频率并阻塞(或降低)其他频率波段的操作。低通滤波器是消除图像中高频部分,但保留低频部分。高通滤波器消除低频部分。参考博客:https://blog.csdn.net/sunny2038/article/details/9155893
  具体模糊和滤波的关系如下图:参考知乎大神:https://www.zhihu.com/question/54918332/answer/142137732

二、练习实现均值滤波和高斯滤波

(一)、均值滤波
1.cv2.blur ------输入--------原图像---------核的大小

img_mean = cv2.blur(img, (5,5))

作用:对椒盐噪声的滤波去除比较好
特征:对于核中区域贡献率相同

代码实现

#均值模糊、中值模糊、自定义模糊    模糊是卷积的一种表象
import cv2 as cv
import numpy as np

def blur_demo(image):      #均值模糊  去随机噪声有很好的去燥效果
    dst = cv.blur(image, (1, 15))    #(1, 15)是垂直方向模糊,(15, 1)还水平方向模糊
    cv.namedWindow('blur_demo', cv.WINDOW_NORMAL)
    cv.imshow("blur_demo", dst)

def median_blur_demo(image):    # 中值模糊  对椒盐噪声有很好的去燥效果
    dst = cv.medianBlur(image, 5)
    cv.namedWindow('median_blur_demo', cv.WINDOW_NORMAL)
    cv.imshow("median_blur_demo", dst)

def custom_blur_demo(image):    # 用户自定义模糊
    kernel = np.ones([5, 5], np.float32)/25   #除以25是防止数值溢出 
    dst = cv.filter2D(image, -1, kernel)
    cv.namedWindow('custom_blur_demo', cv.WINDOW_NORMAL)
    cv.imshow("custom_blur_demo", dst)

src = cv.imread('E:\imageload\lenanoise.jpg')
cv.namedWindow('input_image', cv.WINDOW_NORMAL)
cv.imshow('input_image', src)

blur_demo(src)
median_blur_demo(src)
custom_blur_demo(src)

cv.waitKey(0)
cv.destroyAllWindows()

(二)、高斯滤波
1.cv2.GaussianBlur------输入-------原图像-------------核1.大小(正数,奇数)2.在两个方向上的标准差(如果给一个,则另一个默认和第一个相等)

img_Guassian = cv2.GaussianBlur(img,(5,5),0)

作用:对于高斯噪声的滤除比较好
特征:核中区域贡献率与距离区域中心成正比,权重与高斯分布相关

代码实现

#高斯模糊    轮廓还在,保留图像的主要特征  高斯模糊比均值模糊去噪效果好
import cv2 as cv
import numpy as np

def clamp(pv):
    if pv > 255:
        return 255
    if pv < 0:
        return 0
    else:
        return pv

def gaussian_noise(image):        #加高斯噪声
    h, w, c = image.shape
    for row in range(h):
        for col in range(w):
            s = np.random.normal(0, 20, 3)
            b = image[row, col, 0]   #blue
            g = image[row, col, 1]   #green
            r = image[row, col, 2]   #red
            image[row, col, 0] = clamp(b + s[0])
            image[row, col, 1] = clamp(g + s[1])
            image[row, col, 2] = clamp(r + s[2])
    cv.namedWindow("noise image", cv.WINDOW_NORMAL)
    cv.imshow("noise image", image)
    dst = cv.GaussianBlur(image, (15, 15), 0)  # 高斯模糊
    cv.namedWindow("Gaussian", cv.WINDOW_NORMAL)
    cv.imshow("Gaussian", dst)

src = cv.imread('E:\imageload\lena.jpg')
cv.namedWindow("input_image", cv.WINDOW_NORMAL)
cv.imshow('input_image', src)

gaussian_noise(src)
dst = cv.GaussianBlur(src, (15,15), 0)   #高斯模糊
cv.namedWindow("Gaussian Blur", cv.WINDOW_NORMAL)
cv.imshow("Gaussian Blur", dst)

cv.waitKey(0)
cv.destroyAllWindows()

三、学习了解非线性滤波的原理

图像的空域线性滤波和非线性滤波在空域对图像进行滤波处理无非两种情况,线性滤波和非线性滤波。滤波的意思就是对原图像的每个像素周围一定范围内的像素进行运算,运算的范围就称为掩膜或领域。而运算就分两种了,如果运算只是对各像素灰度值进行简单处理(如乘一个权值)最后求和,就称为线性滤波;而如果对像素灰度值的运算比较复杂,而不是最后求和的简单运算,则是非线性滤波;如求一个像素周围3x3范围内最大值、最小值、中值、均值等操作都不是简单的加权,都属于非线性滤波。

(一)、中值滤波
基本思想:用像素点邻域灰度值的中值代替该像素的灰度值,该方法用去除脉冲噪声,椒盐 噪声的同时又能保留图像的边缘细节
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术。用中值代替邻域中的点的像素值,从而消除独立的噪声点,对于斑点噪声(speckle noise)和椒盐噪声(salt-and–pepper noise)。

img_median = cv2.medianBlur(img, 5)

(二)、双边滤波
结合图像中的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到了保边去噪的目标。
双边滤波是基于空间分布的高斯滤波函数,所以在边缘附近,离得较远的像素不会对边缘上的像素值影响太多。但是只能对低频信息进行较好地滤波。

img_bilater = cv2.bilateralFilter(img,9,75,75)

四、练习实现中值滤波和双边滤波

代码实现

import numpy as np
import cv2
import matplotlib.pyplot as plt
########     四个不同的滤波器    #########
img = cv2.imread('cat.jpg')

# 中值滤波
img_median = cv2.medianBlur(img, 5)

# 双边滤波
img_bilater = cv2.bilateralFilter(img,9,75,75)

# 展示不同的图片
titles = ['srcImg','mean', 'Gaussian', 'median', 'bilateral']
imgs = [img, img_mean, img_Guassian, img_median, img_bilater]

for i in range(5):
    plt.subplot(2,3,i+1)#注意,这和matlab中类似,没有0,数组下标从1开始
    plt.imshow(imgs[i])
    plt.title(titles[i])
plt.show()

参考资料
https://blog.csdn.net/hx1298234467/article/details/49837305
https://blog.csdn.net/dongyu_1989/article/details/78310583
https://blog.csdn.net/huayunhualuo/article/details/81486849
https://blog.csdn.net/qq_27261889/article/details/80822270