Python_图像处理

Python OpenCV 图片模糊操作 blur 与 medi

2021-11-19  本文已影响0人  梦想橡皮擦

Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。

基础知识铺垫

Python OpenCV 中模糊操作的原理是:

基于离散卷积、定义好每个卷积核、不同卷积核得到不同的卷积效果、模糊是卷积的一种表象。橡皮擦表示没看懂,先在脑子中有个大概印象就行,毕竟才学习 20 多天。

本篇博客要学习的模糊有

  1. 均值模糊:一般用来处理图像的随机噪声;
  2. 中值模糊:一般用来处理图像的椒盐噪声;
  3. 自定义模糊:对图像进行增强,锐化等操作。

函数原型介绍

均值模糊

概念:

均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围 8 个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。

哇哦,没看懂,直接看一下原型吧,先用起来,在复盘理论。

cv2.blur(src, ksize[, dst[, anchor[, borderType]]]) -> dst

参数说明:

测试代码如下:

import cv2 as cv
import numpy as np

def blur_demo(src):
    dst = cv.blur(src, (5, 5))
    cv.imshow("blur_demo", dst)

if __name__ == "__main__":
    src = cv.imread("./1.jpg")
    blur_demo(src)
    cv.waitKey()
    cv.destroyAllWindows()
20210120231936115[1].png

中值模糊

概念(读一读就行了):

中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。

函数原型如下:

cv2.medianBlur(src, ksize[, dst]) -> dst

参数说明:

中值模糊一般用在存在一些躁声点图像,例如白噪声,可以去除。

首先通过下述代码制造一张椒盐图片。

import numpy as np
import random
import cv2

def sp_noise(image, prob):
    output = np.zeros(image.shape, np.uint8)
    thres = 1 - prob
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            rdn = random.random()
            if rdn < prob:
                output[i][j] = 0
            elif rdn > thres:
                output[i][j] = 255
            else:
                output[i][j] = image[i][j]
    return output

img = cv2.imread("./1.jpg")
# 添加椒盐噪声,噪声比例 0.02
out = sp_noise(img, prob=0.02)
cv2.imshow("img", out)
cv2.waitKey()

20210120233432745[1].png

对上述代码生成的图片进行中值模糊操作。

# 中值模糊 ,去椒盐噪声
def median_blur_demo(src):
    dst = cv.medianBlur(src, 3)
    cv.imshow("dst", dst)
20210120234027839[1].png

2D 卷积(图像滤波),自定义模糊

概念:

图像作为一个一维信号,也可以通过多种低通过滤器(low-pass filters, LPF)和高通过滤器(high-pass filters, HPF)来过滤。低通过滤器可以去除噪声,或者模糊图像。高通过滤器可以帮助在一个图像中找出边界。

函数原型为:

cv2.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) -> dst

参数说明:

测试代码如下:

# 模糊操作
def filter2D_demo(src):
    # 除以 25 是防止溢出
    kernel = np.ones([5,5],np.float32)/25
    dst = cv.filter2D(src,-1,kernel=kernel)
    cv.imshow("dst",dst)

运行效果:


20210120235312267[1].png

使用 filter2D 函数,实现锐化。

def filter2D_demo(src):

    # 当kernel总和为 1 时:增强锐化
    # 当kernel总和为 0 时:边缘梯度
    kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
    dst = cv.filter2D(src, -1, kernel=kernel)
    cv.imshow("dst", dst)

注意上述代码中 kernel 对应的数组中,各个值都为奇数,总和要等于 1,才是锐化。

20210120235345713[1].png

橡皮擦的小节

本系列博客为学习之旅,部分概念在没有学到,或者必须彻底掌握前,不做扩展学习。保持每天 1 个小时的学习时间即可。

1 个小时又过去了,对 Python OpenCV 相关的知识点,你掌握了吗?

做为初学者,还有很多地方学习的不深入,希望你与我一起坚持下去。

推荐阅读

空闲之余,可以订阅橡皮擦的爬虫百例课程学习爬虫知识。

想学 Python 爬虫,可以订阅橡皮擦专栏哦~ 点击发现惊喜


今天是持续写作的第 <font color="red">60</font> / 100 天。
如果你有想要交流的想法、技术,欢迎在评论区留言。

上一篇下一篇

猜你喜欢

热点阅读