OpenCV实现图像滤波之双边滤波
作者:Sam Chou 发布时间:2022-05-14 07:35:30
标签: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()
来源:https://blog.csdn.net/weixin_45602979/article/details/108667286


猜你喜欢
- 1.什么是Blazor? 有什么优势?ASP.NET Core Blazor 简介Blazor 是一个使用 Blazor 生成交互式客户端
- 做计算机视觉方向,除了流行的各种深度学习算法,很多时候也要会基础的图像处理方法。记录下opencv的一些操作(图像映射变换),日后可以方便使
- 网上关于使用python 的发送multipart/form-data的方法,多半是采用ulrlib2 的模拟post方法,如下
- RPC(Remote Procedure Call Protocol)远程过程调用协议。 一个通俗的描述是:客户端在不知道调用细节的情况下,
- 一、在搭建的时候参考以下文章http://www.cnblogs.com/zsy/archive/2016/02/28/5223957.ht
- MGR全称MySQL Group Replication(Mysql组复制),是MySQL官方于2016年12月推出的一个全新的高可用与高扩
- 本文分析了MySQL中字符串索引对update的影响。分享给大家供大家参考,具体如下:对某一个类型为varchar的字段添加前缀索引后,基于
- 介绍与创建型模式类似,工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类。工厂模式定义一个用于创建对象的接口,这个接口由子类决定
- 前言大家应该都知道,Centos是目前最为流行的Linux服务器系统,其默认的Python 2.x,但是根据python社区的规划,在不久之
- 问题问题1Python是一种动态语言,不支持类型检查。当需要对一个对象执行类型检查时,可能会采用下面的方式:class Foo(object
- 为什么要用jsonpath就跟为什么要用xpath一样,jsonpath的设计灵感来源于xpath。一个强大的json数据提取工具。让用户不
- 将一个列表数据写入output.xlsx的a,b,c……等sheet中import pandas as pddf1 = pd.DataFra
- 最近做Go开发的时候接触到了一个新的orm第三方框架gorose,在使用的过程中,发现没有类似beego进行直接对struct结构进行操作的
- 1.获取远程包go 语言有一个获取远程包的工具就是 go get,目前 go get 支持多数开源社区 (例如:github、googlec
- 1. 简介 追踪某些软件运行时所发生事件的方法, 可以在代码中调用日志中某些方法来记录发生的事情一个事件可以用一个可包含可选变量数
- 这篇文章主要介绍了python如何基于redis实现ip代理池,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 前言在写程序时,我们会经常碰到程序出现异常,这时候我们就不得不处理这些异常,以保证程序的健壮性。处理异常的版本有以下几种,你通常的做法是哪种
- 如下所示:#! /usr/bin/python3# coding = utf-8# from PyQt5 import QtGui,QtCo
- 步骤如下: 1.使用torchvision加载并预处理CIFAR-10数据集、2.定义网络3.定义损失函数和优化器4.训练网络并更新网络参数
- 应用 Scrapy框架 ,配置动态IP处理反爬。# settings 配置中间件DOWNLOADER_MIDDLEWARES = { &nb