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
0
投稿
猜你喜欢
- Knockout是一个以数据模型(data model)为基础的能够帮助你创建富文本,响应显示和编辑用户界面的JavaScript类库。任何
- 前言今天学习Django框架,用ajax向后台发送post请求,直接报了403错误,说CSRF验证失败;先前用模板的话都是在里面加一个 {%
- 快速排序(QuickSort)是对冒泡排序的一种改进:基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一
- 本文实例讲述了Python常见数据类型转换操作。分享给大家供大家参考,具体如下:类型转换主要针对几种存储工具:list、tuple、dict
- 在安装wordpress的时候,按照里面的readme.html的步骤进行安装,但是在访问wp-admin/install.php的时候就出
- 如下所示:import serialimport sysimport osimport timeimport redef wait_for_
- 本文为大家分享了pygame游戏之旅的第5篇,供大家参考,具体内容如下在游戏中添加显示文字:这里自己定义一个crash函数接口:def cr
- 本文介绍基于Python语言arcpy模块,实现栅格影像图层建立与多幅遥感影像数据批量拼接(Mosaic)的操作。首先,相关操作所需具体代码
- 介绍本期案例是带着大家制作一个属于自己的GUI图形化界面—>用于设计签名的哦(效果如下图),是不是感觉很好玩,是不
- 这一段CSS代码相当简单,目的就是想用CSS来控制某段文字的显示与隐藏。起初我采用了下面的代码,令人不可思议的是,它们在我的IE6.0上居然
- 首先,这片文章纯粹是我的个人经验之谈,适用于我常见的环境及项目中。个人建议,数据库字符集尽量使用utf8(HTML页面对应的是utf-8),
- 绘制直线图,确定x范围和y的范围代码:import matplotlib.pyplot as pltimport numpy as npxp
- 关于中大型开发b/s开发中的缓存(cache),我的一些看法,有不正确的或者是有笔误的地方,请指正。thanks首先,应该了解基本的,对于缓
- 以下为测试例子。 1.首先创建两张临时表并录入测试数据: 代码如下:create table #temptest1 ( id i
- 1.锦短情长为什么选择这个标题,借鉴了一封情书里面的情长纸短,还吻你万千。锦短情长都只谓人走茶凉,怎感觉锦短情长?一提起眼泪汪汪,是明月人心
- 方法一:手动计算变量的梯度,然后更新梯度import torchfrom torch.autograd import Variable# 定
- 我就废话不多说了,大家还是直接看代码吧~# 两个依赖包: sasl&thriftThe easier way I find to i
- 看看这个logo,有些像python的小蛇吧 。这次介绍的数据库codernityDB是纯python开发的。先前用了下tinyDB这个本地
- 一个很不错的效果,用键盘的箭头键控制一个漂亮的箭头!也许能给你启发,做出一款有趣的小游戏呢!运行代码框<html xmlns:v=&q
- 代码如下:USE [tempdb] GO /****** Object: UserDefinedFunction [dbo].[fun_ge