11, opencv核心操作学习- 图像平滑

546 阅读4分钟

图像也可以像电信号一样, 进行滤波处理。低通滤波(LPF)可以帮助我们去除噪音,模糊图像, 高通滤波(HPF)可以帮我们找到图像的边缘。

1, filter2D(src, ddepth, kernel, dst=None, anchor=None, delta=None, borderType=None)

参考: blog.csdn.net/keith_bb/ar…

参数 含义
src 输入图像
ddepth -1 表示与原图一致
kernel 滤波器核
dst
anchor 内核的基准点(anchor),其默认值为(-1,-1)说明位于kernel的中心位置。基准点即kernel中与进行处理的像素点重合的点。
delta 在储存目标图像前可选的添加到像素的值,默认值为0
borderType 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。

构建一个5X5的平均滤波器核, 将核放在像素A上, 求像素周边的像素和,再去平均值来代替像素A。重复直到图像的所有像素都计算过一边为止

A = \begin{bmatrix}
1 & 1 & 1 & 1 & 1\\
1 & 1 & 1 & 1 & 1\\
1 & 1 & 1 & 1 & 1\\
1 & 1 & 1 & 1 & 1\\
1 & 1 & 1 & 1 & 1\\
\end{bmatrix}

# coding:utf-8

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


def show(imgs, titles):
    j = 121
    for i in range(len(imgs)):
        plt.subplot(j), plt.imshow(imgs[i]), plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
        j = j +1
    plt.show()

if __name__ == '__main__':
    img = cv2.imread('./001_720x1080.jpg', cv2.IMREAD_UNCHANGED)
    kernel = np.ones((5,5), np.float32)/25
    out= cv2.filter2D(img, -1, kernel)
    show([cv2.cvtColor(img, cv2.COLOR_BGR2RGB), cv2.cvtColor(out, cv2.COLOR_BGR2RGB)],['original', 'filter2D'])

2, 图像模糊(图像平滑)

opencv提供了4中模糊技术

2.1 平均

使用了归一化卷积框完成的, 使用卷积框内的所有像素的平均值来代替中心像素可以使用cv2.blur和cv2.boxFilter()来完成

# coding:utf-8

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


def show(imgs, titles):
    j = 121
    for i in range(len(imgs)):
        plt.subplot(j), plt.imshow(imgs[i]), plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
        j = j +1
    plt.show()

if __name__ == '__main__':
    img = cv2.imread('./001_720x1080.jpg', cv2.IMREAD_UNCHANGED)
    out = cv2.blur(img, (5, 5))

    show([cv2.cvtColor(img, cv2.COLOR_BGR2RGB), cv2.cvtColor(out, cv2.COLOR_BGR2RGB)],['original', 'blur'])

cv2.blur(src, ksize, dst=None, anchor=None, borderType=None)

参数 含义
src 输入图像
ksize 卷积核的大小
dst
anchor 内核的基准点(anchor),其默认值为(-1,-1)说明位于kernel的中心位置。基准点即kernel中与进行处理的像素点重合的点。
borderType 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。

2.2 高斯模糊

高斯模糊能有效去除高斯噪音。

把卷积核换成高斯核, 中心点越往外, 对中心点的影响越小。 可以直接使用cv2.GaussianBlur方法, 也可以用cv2.getGaussianKernel() 自己构建个高斯核。

# coding:utf-8

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


def show(imgs, titles):
    j = 121
    for i in range(len(imgs)):
        plt.subplot(j), plt.imshow(imgs[i]), plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
        j = j +1
    plt.show()

if __name__ == '__main__':
    img = cv2.imread('./001_720x1080.jpg', cv2.IMREAD_UNCHANGED)
    out = cv2.GaussianBlur(img, (5, 5), 0)
    show([cv2.cvtColor(img, cv2.COLOR_BGR2RGB), cv2.cvtColor(out, cv2.COLOR_BGR2RGB)],['original', 'blur'])

GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)

参数 含义
src 输入图像
ksize 卷积核大小 (必须为奇数)
sigmaX 标准差
dst
sigmaY
borderType 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。

2.3 中值模糊

这个滤波器经常用来去出椒盐噪声。

是用与卷积框对应像素的中值来替代中心像素的值。

# coding:utf-8

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


def show(imgs, titles):
    j = 121
    for i in range(len(imgs)):
        plt.subplot(j), plt.imshow(imgs[i]), plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
        j = j +1
    plt.show()

if __name__ == '__main__':
    img = cv2.imread('./001_720x1080.jpg', cv2.IMREAD_UNCHANGED)
    out = cv2.medianBlur(img, 5)
    show([cv2.cvtColor(img, cv2.COLOR_BGR2RGB), cv2.cvtColor(out, cv2.COLOR_BGR2RGB)],['original', 'blur'])

medianBlur(src, ksize, dst=None)

参数 含义
src 输入图像
ksize 卷积核的大小
dst

2.4 双边滤波

能在保持边界清晰的情况下有效的去出噪音。但是这种操作与其他滤波器相比会比较慢。双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函 数确保只有邻近区域的像素对中心点有影响, 灰度值相似性高斯函数确保只有 与中心像素灰度值相似的才会用来做模糊计算。所以这种方法会确保边界不 会模糊掉, 因为边界处的灰度值变化比较大。

# coding:utf-8

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


def show(imgs, titles):
    j = 121
    for i in range(len(imgs)):
        plt.subplot(j), plt.imshow(imgs[i]), plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
        j = j +1
    plt.show()

if __name__ == '__main__':
    img = cv2.imread('./001_720x1080.jpg', cv2.IMREAD_UNCHANGED)
    out = cv2.bilateralFilter(img, 19,5, 5)
    show([cv2.cvtColor(img, cv2.COLOR_BGR2RGB), cv2.cvtColor(out, cv2.COLOR_BGR2RGB)],['original', 'bilateralFilter'])


bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)

参数 含义
src 输入图像
d 邻域直径
sigmaColor 灰度值高斯函数标准差
sigmaSpace 空间高斯函数标准差
dst
borderType