【Opencv-Python】数字图像处理(三)——空域图像处理(二)


>>文章导航

1 实验目的和要求

2 实验环境与配置

3 空域滤波

3.1 图像平滑(均值滤波、中值滤波、高斯滤波)

3.2 图像锐化

(1) 拉普拉斯模板(线性)

4 实验心得与思考

4.1 实验心得总结

4.2 实验问题与解决


1 实验目的和要求

(1)掌握图像处理的基本原理和滤波器的作用,了解不同滤波器的特点和应用范围;

(2)理解并掌握基于拉普拉斯模板的图像锐化等处理方法;

(3)了解并掌握图像运算的基本概念和方法等;

(4)通过实验,提高对图像处理基本概念的理解,培养实际操作和解决问题的能力。

2 实验环境与配置

(1)计算机;

(2)Python及Anaconda软件;

(3)典型的灰度、彩色图像等文件。

3 空域滤波

        空域滤波是一种邻域处理方法,通过直接在图像空间中对邻域内像素进行处理,达到平滑或锐化图像的作用。

3.1 图像平滑(均值滤波、中值滤波、高斯滤波)

(1)均值滤波--cv2.blur(原始图像,核大小) (2)中值滤波--cv2.medianBlur(src, ksize) (3)高斯滤波--cv2.GaussianBlur(src, ksize, sigmaX)

ksize = 3 :

import cv2
img = cv2.imread('D:\images\lena_color_512_saltpepper.jpg ')   # 读取图片
result_blur = cv2.blur(img, (3, 3))     #均值滤波
result_GaussianBlur = cv2.GaussianBlur(img, (3, 3), 0)    # 高斯滤波(即课本的“加权平均滤波”)
result_medianBlur = cv2.medianBlur(img, 3) # 中值滤波
cv2.imshow('original', img)
cv2.imshow('result_blur', result_blur)
cv2.imshow('result_GaussianBlur', result_GaussianBlur)
cv2.imshow('result_medianBlur', result_medianBlur)
cv2.waitKey(0)
cv2.destroyAllWindows()

image-20231102110201130

image-20231102110236671

1. 比较哪种滤波的去噪效果更好。

        中值滤波效果最好。

        均值滤波是一种简单的平滑滤波器,它取像素点邻域的平均值作为新的像素值。这种滤波器对于消除图像中的随机噪声(特别是高斯噪声)有较好的效果,但是它对于椒盐噪声的抑制效果较差。

        高斯滤波实际上也是加权平均滤波,只不过它给离中心近的像素赋予更大的权重。相比于均值滤波,高斯滤波对于消除噪声的效果更好一些,特别是对于消除椒盐噪声。

        中值滤波是一种非线性操作滤波器,它将像素邻域的灰度值进行排序,然后取中间值作为新的像素值。中值滤波对于消除椒盐噪声特别有效,但是对于高斯噪声的抑制效果不如前两者。

        哪种滤波器的去噪效果更好,取决于你的图像具体存在哪种噪声。如果处理的是高斯噪声,那么均值滤波和高斯滤波的效果会更好。如果处理的是椒盐噪声,那么中值滤波的效果会更好。

2. 对每种滤波函数,尝试不同的核大小 ksize (如 3 ,5 ,7 ),比较输出的平滑效果有何不同。

        对于均值滤波,改变核大小会影响到滤波器对图像的平滑程度。较大的核大小将使滤波器对图像的平滑效果更强,这将使图像看起来更加模糊。较小的核大小将使滤波器的平滑效果较弱,图像将保留更多的细节。

        对于高斯滤波,改变核大小也会影响到滤波器对图像的平滑程度。与均值滤波类似,较大的核大小将使图像看起来更加模糊,较小的核大小将使图像保留更多的细节。

        对于中值滤波,改变核大小主要影响滤波器对图像的平滑程度。由于中值滤波是一种非线性操作,它对消除椒盐噪声特别有效,因此改变核大小对中值滤波的效果影响不大

ksize = 5 :

import cv2
img = cv2.imread('D:\images\lena_color_512_saltpepper.jpg ')   # 读取图片
result_blur = cv2.blur(img, (5, 5))     #均值滤波
result_GaussianBlur = cv2.GaussianBlur(img, (5, 5), 0)    # 高斯滤波(即课本的“加权平均滤波”)
result_medianBlur = cv2.medianBlur(img, 5) # 中值滤波
cv2.imshow('original', img)
cv2.imshow('result_blur', result_blur)
cv2.imshow('result_GaussianBlur', result_GaussianBlur)
cv2.imshow('result_medianBlur', result_medianBlur)
cv2.waitKey(0)
cv2.destroyAllWindows()

image-20231102111129445

image-20231102111206824

ksize = 7 :

import cv2
img = cv2.imread('D:\images\lena_color_512_saltpepper.jpg ')   # 读取图片
result_blur = cv2.blur(img, (7, 7))     #均值滤波
result_GaussianBlur = cv2.GaussianBlur(img, (7, 7), 0)    # 高斯滤波(即课本的“加权平均滤波”)
result_medianBlur = cv2.medianBlur(img, 7) # 中值滤波
cv2.imshow('original', img)
cv2.imshow('result_blur', result_blur)
cv2.imshow('result_GaussianBlur', result_GaussianBlur)
cv2.imshow('result_medianBlur', result_medianBlur)
cv2.waitKey(0)
cv2.destroyAllWindows()

image-20231102111310714

image-20231102111337763

3. 自选一幅没有噪声的图片, 分别用上述三种滤波函数进行滤波, 观察无噪声情况下的平滑效果有何特点。

        在无噪声的情况下,这三种滤波函数都可以使图像变得平滑,但是它们的特点有所不同。均值滤波和中值滤波都会使图像稍微变模糊,但是中值滤波对于边缘的保留效果更好一些。高斯滤波可以在保持图像清晰度的同时,去除一些小的噪声。

        这三种滤波函数的效果还受到滤波器大小的影响。较大的滤波器可以更好地去除噪声,但是会使图像变得更加模糊。较小的滤波器可以更好地保留图像的细节,但是去除噪声的效果会较差。

import cv2
img = cv2.imread('D:\myimages\lake.jpg ')   # 读取图片
result_blur = cv2.blur(img, (7, 7))     #均值滤波
result_GaussianBlur = cv2.GaussianBlur(img, (7, 7), 0)    # 高斯滤波(即课本的“加权平均滤波”)
result_medianBlur = cv2.medianBlur(img, 7) # 中值滤波
cv2.imshow('original', img)
cv2.imshow('result_blur', result_blur)
cv2.imshow('result_GaussianBlur', result_GaussianBlur)
cv2.imshow('result_medianBlur', result_medianBlur)
cv2.waitKey(0)
cv2.destroyAllWindows()

image-20231102111838077

image-20231102111936772

4. 在不调用上述 cv2 自带 滤波 函数 的 情况下, 自己手动编程分别实现中值滤波、 高斯滤波(课本 p62 加权平均滤波), 要提供自己实现的代码和滤波效果。 滤波器大小为定为 3 ×3。

中值滤波:

import cv2
import numpy as np
def median_filter(image):
    height, width = image.shape
    result = np.zeros((height, width), dtype=np.uint8)
    for i in range(1, height - 1):
        for j in range(1, width - 1):
            neighborhood = image[i - 1:i + 2, j - 1:j + 2]
            result[i, j] = np.median(neighborhood)
    return result
# 读取图像
image = cv2.imread('D:\myimages\cat.jfif', cv2.IMREAD_GRAYSCALE)
# 应用中值滤波
filtered_image = median_filter(image)
# 显示原始图像和滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Median Filtered Image', filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

image-20231109104006962

高斯滤波:

import cv2
import numpy as np
def gaussian_filter(image):
    height, width = image.shape
    result = np.zeros((height, width), dtype=np.uint8)
​
    kernel = np.array([[1, 2, 1],
                      [2, 4, 2],
                      [1, 2, 1]]) / 16
​
    for i in range(1, height - 1):
        for j in range(1, width - 1):
            neighborhood = image[i - 1:i + 2, j - 1:j + 2]
            weighted_sum = np.sum(neighborhood * kernel)
            result[i, j] = weighted_sum
​
    return result
# 读取图像
image = cv2.imread('D:\myimages\cat.jfif', cv2.IMREAD_GRAYSCALE)
# 应用高斯滤波
filtered_image = gaussian_filter(image)
# 显示原始图像和滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Gaussian Filtered Image', filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

image-20231109103706779

3.2 图像锐化

dst = cv2.filter2D(src, -1, kernel) 上式中-1 表示目标图像和原图像深度(数据位数)一致,kernel 为滤波器模板,不同的模板具有的滤波效果。

(1) 拉普拉斯模板(线性)

kernel = 8:

import cv2
import numpy as np
src = cv2.imread('D:\myimages\dog_single.png')
kernel = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]])
dst = cv2.filter2D(src, -1, kernel)
cv2.imshow('original', src)
cv2.imshow('dst', dst)
cv2.imshow('src+dst', src+dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

image-20231102201338682

2. 思考题:如果将上例中滤波模板中心的值由 8 改为 9 ,经filter2D(src, -1, kernel) 滤波后的图像是什么?简要分析为何会出现这样的滤波图像。

        如果将滤波模板中心的值由8改为9,那么滤波器将变为一个锐化滤波器。经过filter2D(src, -1, kernel)滤波后,图像将变得更加清晰。因为锐化滤波器可以突出图像的边缘和细节,使图像看起来更加清晰。同时,由于滤波器中心值的变化,滤波器对图像的平滑程度也会有所不同,因此滤波后的图像可能会略有变化。

kernel = 9:

import cv2
import numpy as np
src = cv2.imread('D:\myimages\dog_single.png')
kernel = np.array([[-1, -1, -1],
[-1, 9, -1],
[-1, -1, -1]])
dst = cv2.filter2D(src, -1, kernel)
cv2.imshow('original', src)
cv2.imshow('dst', dst)
cv2.imshow('src+dst', src+dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

image-20231102201532632

3. 换另一幅图像(不限于文件夹 images 内的图像,可以自己找)进行基于拉普拉斯模板的图像锐化。

import cv2
import numpy as np
src = cv2.imread('D:\myimages\cat.jfif')
kernel = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]])
dst = cv2.filter2D(src, -1, kernel)
cv2.imshow('original', src)
cv2.imshow('dst', dst)
cv2.imshow('src+dst', src+dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

image-20231102201758002

4. 在不调用 filter2D 函数的情况下, 自己手动编程实现下面这个拉普拉斯模板的锐化滤波,要提供自己实现的代码和滤波效果。 滤波器 大小为 定为 3 ×3。

image-20231102112659756

import cv2
import numpy as np
def laplacian_sharpening(image):
    height, width = image.shape
    result = np.zeros((height, width), dtype=np.uint8)
    # 定义拉普拉斯锐化滤波器
    laplacian_kernel = np.array([[0, -1, 0],
                                 [-1, 4, -1],
                                 [0, -1, 0]])
    for i in range(1, height - 1):
        for j in range(1, width - 1):
            neighborhood = image[i - 1:i + 2, j - 1:j + 2]
            weighted_sum = np.sum(neighborhood * laplacian_kernel)
            result[i, j] = np.clip(weighted_sum, 0, 255)  # 确保像素值在 0 到 255 之间
    return result
# 读取图像
image = cv2.imread('D:\myimages\cat.jfif', cv2.IMREAD_GRAYSCALE)
# 应用拉普拉斯锐化滤波
sharpened_image = laplacian_sharpening(image)
# 显示原始图像和锐化后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Sharpened Image', sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

image-20231109104434716

4 实验心得与思考

4.1 实验心得总结

        通过本次实验,我深入了解了图像处理的基本原理和不同滤波器的特点和应用范围。我不仅掌握了如何使用均值滤波、高斯滤波和中值滤波对图像进行去噪和平滑处理,还学习了如何利用拉普拉斯模板对图像进行锐化处理。同时,我也了解了图像运算的基本概念和方法。

        在实验过程中,我通过观察和比较处理后的图像,发现不同滤波器在去噪效果和图像平滑效果方面有着不同的表现。均值滤波对消除图像中的随机噪声(特别是高斯噪声)有较好的效果,但会降低图像的清晰度。高斯滤波能更好地消除高斯噪声,但仍然会保留一部分噪声。中值滤波对消除椒盐噪声特别有效,但会使图像变得模糊。我还发现拉普拉斯锐化方法能够增强图像的边缘细节,使图像看起来更加清晰。

4.2 实验问题与解决

        在实验中遇到预想之外的问题(比如得到的图像处理效果与预期不同),自己找到原因,并想到办法加以解决。

(1)用拉普拉斯滤波的将数组元素与序列进行赋值时出现问题, result数组用于存储整个滤波后的图像解决遇到的错误:

image-20231102223337679


​​

如果觉得作者写得还不错的话, 点赞 / 收藏 / 评论 / 转发 四连支持一下吧~😘

最重要的是点一个大大的关注, 你的支持就是作者创作的最大动力!!!


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值