OpenCV实现图像滤波之双边滤波

 更新时间:2021年10月11日 16:27:45   作者:Sam Chou  
这篇文章主要为大家详细介绍了OpenCV实现图像滤波之双边滤波,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了opencv实现双边滤波的具体代码,供大家参考,具体内容如下

1、2D卷积

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
 
"""
使用自定义卷积核进行图像2D卷积操作
    函数原型:
        filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) -> dst
        函数返回值:dst:2d卷积操作后的结果
        函数解析:
            ddepth:指定输出图像深度,-1表示与src深度保持一致
            kernel:卷积内核大小, 需大于零,可以不同,如核大小(4,5)
            anchor:锚点;默认值Point(-1,-1)表示锚位于内核中央
            delta:在将它们存储在dst中之前,将delta可选值添加到已过滤的像素中,默认为None
            borderType:边框模式用于图像外部的像素, 默认边缘像素拷贝
"""
 
import cv2 as cv
import numpy as np
 
img = cv.imread('./test.png')
 
# 自定义的一些卷积核
kernel = np.ones((5, 5), np.float32) / 25
 
kernel_user_1 = np.array([[0, 0, 1, 0, 0],
                          [0, 0, 1, 0, 0],
                          [1, 1, 1, 1, 1],
                          [0, 0, 1, 0, 0],
                          [0, 0, 1, 0, 0]]) / 9
 
kernel_user_2 = np.array([[1, 0, 0, 0, 1],
                          [0, 1, 0, 1, 0],
                          [0, 0, 1, 0, 0],
                          [0, 1, 0, 1, 0],
                          [1, 0, 0, 0, 1]]) / 9
 
kernel_user_3 = np.array([[0, 0, 0, 0, 0],
                          [0, 1, 1, 1, 0],
                          [0, 1, 1, 1, 0],
                          [0, 1, 1, 1, 0],
                          [0, 0, 0, 0, 0]]) / 9
 
kernel_user_4 = np.array([[1, 1, 1, 1, 1],
                          [1, 0, 0, 0, 1],
                          [1, 0, 0, 0, 1],
                          [1, 0, 0, 0, 1],
                          [1, 1, 1, 1, 1]]) / 16
 
dst = cv.filter2D(img, -1, kernel)
dst1 = cv.filter2D(img, -1, kernel_user_1)
dst2 = cv.filter2D(img, -1, kernel_user_2)
dst3 = cv.filter2D(img, -1, kernel_user_3)
dst4 = cv.filter2D(img, -1, kernel_user_4)
 
h1 = np.hstack((img, dst, dst1))
h2 = np.hstack((dst2, dst3, dst4))
cv.imshow('show', np.vstack((h1, h2)))
 
cv.waitKey(0)
cv.destroyAllWindows()
 
# 理解提高
small = np.array(range(10, 55, 5), np.uint8).reshape(3, -1)
print(small)
print('*' * 60)
 
small_filter = cv.filter2D(small, -1, (np.ones((3, 3), np.float32) / (3 * 3)))
print(small_filter)

2、双边滤波

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
 
"""
    双边滤波器可以很好的保存图像边缘细节并滤除掉低频分量的噪音,
    但是双边滤波器的效率不是太高,花费的时间相较于其他滤波器而言也比较长。
    函数原型:
        bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) -> dst
        重点参数解析:
            d:表示在过滤过程中每个像素邻域的直径范围。如果该值是非正数,则将由sigmaSpace计算
            sigmaColor:颜色空间过滤器的sigma值,值越大表示有越宽广的颜色混合到一起
            sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着越远的像素将相互影响
            borderType:边框模式用于图像外部的像素, 默认边缘像素拷贝
"""
 
import cv2 as cv
import numpy as np
 
# img_path = './images/Fig4.11(a).jpg'
# img_path = './images/Fig5.08(b).jpg'
# img_path = './images/Fig0519(a)(florida_satellite_original).tif'
img_path = 'noisy2.png'
 
img = cv.imread(img_path)
 
 
def nothing(x):
    pass
 
 
cv.namedWindow('image')
 
# 创建滑动条
cv.createTrackbar('d', 'image', 0, 100, nothing)
cv.createTrackbar('sigmaColor', 'image', 0, 200, nothing)
cv.createTrackbar('sigmaSpace', 'image', 0, 200, nothing)
 
cv.imshow('img', img)
cv.imshow('image', img)
 
while True:
    k = cv.waitKey(25) & 0XFF
    if chr(k) == 'q':
        break
    if chr(k) == 'k':
        d = cv.getTrackbarPos('d', 'image')
        sigmaColor = cv.getTrackbarPos('sigmaColor', 'image')
        sigmaSpace = cv.getTrackbarPos('sigmaSpace', 'image')
        b_filter = cv.bilateralFilter(img, d, sigmaColor, sigmaSpace)
        ret, thresh = cv.threshold(b_filter, 127, 255, cv.THRESH_BINARY)
        sava_name = ''.join(('outputs/', 'b_filter', str(d), '_', str(sigmaColor), '_', str(sigmaColor)))
        cv.imshow('image', np.hstack((b_filter, thresh)))
        cv.imwrite(sava_name + '.jpg', b_filter)
        cv.imwrite(sava_name + '_thr.jpg', thresh)
 
cv.destroyAllWindows()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python标准库datetime date模块的详细介绍

    Python标准库datetime date模块的详细介绍

    这篇文章主要介绍了Python标准库datetime date模块的详细介绍,datetime是Python提供的操作日期和时间的标准库,主要有datetime.date模块、datetime.time模块及datetime.datetime模块
    2022-07-07
  • Python循环语句之while循环和for循环详解

    Python循环语句之while循环和for循环详解

    在Python中,循环语句用于重复执行一段代码,直到满足某个条件为止,在Python中,有两种主要的循环语句:for循环和while循环,本文就来给大家介绍一下这两个循环的用法,需要的朋友可以参考下
    2023-08-08
  • 详解pandas使用drop_duplicates去除DataFrame重复项参数

    详解pandas使用drop_duplicates去除DataFrame重复项参数

    这篇文章主要介绍了详解pandas使用drop_duplicates去除DataFrame重复项参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • PyTorch 检查GPU版本是否安装成功的操作

    PyTorch 检查GPU版本是否安装成功的操作

    这篇文章主要介绍了PyTorch 检查GPU版本是否安装成功的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Pycharm汉化两种方法(pycharm改为中文版)

    Pycharm汉化两种方法(pycharm改为中文版)

    PyCharm是一款流行的Python开发环境,提供了丰富的功能和工具,使得Python的开发和调试变得更加方便和高效,下面这篇文章主要给大家介绍了Pycharm汉化的两种方法,所谓汉化就是将pycharm改为中文版,需要的朋友可以参考下
    2023-06-06
  • 深入解析Python中的lambda表达式的用法

    深入解析Python中的lambda表达式的用法

    这篇文章主要介绍了深入解析Python中的lambda表达式的用法,包括其与def之间的区别,需要的朋友可以参考下
    2015-08-08
  • python把一个字符串切开的实例方法

    python把一个字符串切开的实例方法

    在本篇文章里小编给大家整理的是一篇关于python把一个字符串切开的实例方法,需要的朋友们可以学习参考下。
    2020-09-09
  • Python 最短路径的几种求解方式

    Python 最短路径的几种求解方式

    本文主要介绍了Python 最短路径的几种求解方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • python列表生成器常用迭代器示例详解

    python列表生成器常用迭代器示例详解

    这篇文章主要为大家介绍了python列表生成器常用迭代器示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Python中强大的函数map filter reduce使用详解

    Python中强大的函数map filter reduce使用详解

    Python是一门功能丰富的编程语言,提供了许多内置函数,以简化各种编程任务,在Python中,map(),filter()和reduce()是一组非常有用的函数,它们允许对可迭代对象进行操作,从而实现数据转换、筛选和累积等操作,本文将详细介绍这三个函数,包括它们的基本用法和示例代码
    2023-11-11

最新评论