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

操作小记(图像平滑处理)

程序员文章站 2022-07-14 09:47:01
...

图像平滑处理

描述:使用均值滤波、中值滤波、高斯滤波、双边滤波和自定义卷积核对同一幅图像进行处理,观察其结果的不同

代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

plt.close('all')

img = cv2.cvtColor(cv2.imread("lena.jpg", 1), cv2.COLOR_BGR2RGB)

# 均值滤波
avg = cv2.blur(img, (5, 5))

# 中值滤波
median = cv2.medianBlur(img, 3)

# 高斯滤波器
guass = cv2.GaussianBlur(img, (5, 5), 0, 0)

# 双边滤波器
bi = cv2.bilateralFilter(img, 55, 100, 100)

# 锐化效果,提高图像对比度
kenerl = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
sharpen = cv2.filter2D(img, -1, kernel=kenerl)

titles = ['ori', 'mean', 'Guass', 'median', 'bilateral', 'filter2D']
images = [img, avg, guass, median, bi, sharpen]

for i in range(6):
    plt.subplot(2, 3, i + 1), plt.imshow(images[i])
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

plt.show()

效果
操作小记(图像平滑处理)

思考

1.读取一幅带有纹理的图像,使用cv2.GuassianBlur()平滑,使用对称3x3、5x5、9x9和11x11大小窗口平滑并显示结果

代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

plt.close('all')

img = cv2.cvtColor(cv2.imread("lena.jpg", 1), cv2.COLOR_BGR2RGB)

# 高斯滤波器
guass1 = cv2.GaussianBlur(img, (3, 3), 0, 0)
guass2 = cv2.GaussianBlur(img, (5, 5), 0, 0)
guass3 = cv2.GaussianBlur(img, (11, 11), 0, 0)

titles = ['ori', '3x3', '5x5', '11x11']
images = [img, guass1, guass2, guass3]

for i in range(4):
    plt.subplot(2, 2, i + 1), plt.imshow(images[i])
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

plt.show()

效果
操作小记(图像平滑处理)


2.通过5x5高斯滤波器平滑图像两次,输出结是否和11x11滤波器平滑一次几乎相同?为什么?

答:不一样,高斯滤波是对周围像素计算加权平均值,较近的像素具有较大的权重值,所以11x11的范围算出的加权平均值,与5x5算两次得到的值不可能相同

代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

plt.close('all')

img = cv2.cvtColor(cv2.imread("lena.jpg", 1), cv2.COLOR_BGR2RGB)

# 高斯滤波器
guass1 = cv2.GaussianBlur(img, (3, 3), 0, 0)
guass2 = cv2.GaussianBlur(guass1, (5, 5), 0, 0)
guass3 = cv2.GaussianBlur(img, (11, 11), 0, 0)

titles = ['ori', 'first 5x5', 'second 5x5', '11x11']
images = [img, guass1, guass2, guass3]

for i in range(4):
    plt.subplot(2, 2, i + 1), plt.imshow(images[i])
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

plt.show()

效果
操作小记(图像平滑处理)

相关标签: 机器视觉