Python OpenCV 边缘滤波保留(EPF)

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

基础知识铺垫

前几篇博客学习到的各种模糊都属于卷积操作,它们存在一个共同点,模糊之后图像的边缘信息不再存在。

本篇博客学习的边缘保留滤波算法(EPF),是一种能通过卷积处理实现模糊图像的同时,又不会对图像边缘造成破坏,并且卷积操作之后的图像,可以完整保存图像整体边缘。

具体实现分为:高斯双边滤波,均值迁移滤波

原理不在细说,属于数学知识,先用起来,等需要的时候,在反推数学基础知识。

橡皮擦学到这时的第一个感觉就是,放弃吧,根本不知道这些内容用在哪里!

函数原型介绍

高斯双边滤波

双边滤波函数原型如下:

dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])

参数说明:

  • src:输入图像;
  • d:过滤过程中每个像素邻域的直径范围。如果不是正数,则函数会从参数 sigmaSpace 计算该值;
  • sigmaColor:颜色空间过滤器的 sigma 值,参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半等色区域;
  • sigmaSpace:坐标空间中滤波器的 sigma 值,如果该值较大,则意味着越远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当 d>0 时,d 指定了邻域大小且与 sigmaSpace 无关,否则 d 正比于 sigmaSpace。
  • dst:和源图象相同大小、相同格式的输出图象;

一般将 sigmaSpace 设置大一些,sigmaColor 设置小一些,最终呈现的效果较好。

优缺点:
双边滤波,可很好的保存图像边缘细节,并且过滤掉低频分量的噪音,但是双边滤波效率不是很高,花费时间比其他滤波器较长。

测试代码如下,先掌握函数基本使用再说。

import cv2 as cv
import numpy as np

# 双边滤波
def bilater(image):
    # 第三个参数大一点(color),第四个小一点(space)
    dst = cv.bilateralFilter(image, 0, 100, 15)
    cv.namedWindow("dst")
    cv.imshow("dst", dst)

src = cv.imread("./123.jpg")
cv.namedWindow('src')
cv.imshow('src', src)

bilater(src)

cv.waitKey(0)
cv.destroyAllWindows()

运行效果,有点美颜磨皮的效果了,不过效果还不是很好,估计是参数的问题。

均值迁移滤波

均值迁移算法是一种通用的聚类算法,它的基本原理是:

对于给定的一定数量样本,任选其中一个样本,以该样本为中心点划定一个圆形区域,求取该圆形区域内样本的质心,即密度最大处的点,再以该点为中心继续执行上述迭代过程,直至最终收敛。(没看太明白,大概了解一下即可)

函数原型如下:

dst = cv2.pyrMeanShiftFiltering(src, sp, sr[, dst[, maxLevel[, termcrit]]])

参数说明:

  • src:输入图像,8 位 3 通道图像;
  • sp:迁移物理空间半径大小;
  • sr:迁移色彩空间半径大小;
  • dst:可选参数,和源图象相同大小、相同格式的输出图象;
  • maxLevel:可选参数,金字塔的最大层数;
  • termcrit:可选参数,迁移迭代终止条件,可以设置为迭代次数满足终止,迭代目标与中心点偏差满足终止,或者两者的结合。

所有参数中,spsr 必选,二者设置的值越大,对图像色彩的平滑效果越明显,同时函数耗时越多。

测试代码如下:

import cv2 as cv
import numpy as np

# 双边滤波
def bilater(image):
    # 第三个参数大一点(color),第四个小一点(space)
    dst = cv.bilateralFilter(image, 0, 100, 15)
    cv.namedWindow("dst")
    cv.imshow("dst", dst)

# 均值迁移滤波
def pyrmeanshift(src):
    dst = cv.pyrMeanShiftFiltering(src, 10, 50)
    cv.imshow("dst", dst)

src = cv.imread("./123.jpg")
cv.namedWindow('src')
cv.imshow('src', src)

pyrmeanshift(src)

cv.waitKey(0)
cv.destroyAllWindows()

运行效果,有点像油画的效果。

橡皮擦的小节

最近有小伙伴给橡皮擦发私信询问:“橡皮擦,我们这样不学习原理就 CALL 函数,能学会 OpenCV 吗?”

“放心,没有问题,365 天路还长着呢”

坚持吧,橡皮擦给这种学习形式命名为“上帝视角学习法”

先用最简单的办法,把 OpenCV 中的知识点都过一遍,掌握全局概念之后,在细究里面每一个细节点

如果每一个知识都钻牛角尖,天天都是难点,你很难坚持下去。

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

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

相关阅读


  1. Python 爬虫 100 例教程,超棒的爬虫教程,立即订阅吧
  2. Python 爬虫小课,精彩 9 讲

今天是持续写作的第 63 / 100 天。
如果你有想要交流的想法、技术,欢迎在评论区留言。


如果你想跟博主建立亲密关系,可以关注同名公众号 梦想橡皮擦,近距离接触一个逗趣的互联网高级网虫。
博主 ID:梦想橡皮擦,希望大家点赞评论收藏

免责声明:务必仔细阅读

  • 本站为个人博客,博客所转载的一切破解、path、补丁、注册机和注册信息及软件等资源文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。

  • 本站为非盈利性站点,打赏作为用户喜欢本站捐赠打赏功能,本站不贩卖软件等资源,所有内容不作为商业行为。

  • 本博客的文章中涉及的任何解锁和解密分析脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断.

  • 本博客的任何内容,未经许可禁止任何公众号、自媒体进行任何形式的转载、发布。

  • 博客对任何脚本资源教程问题概不负责,包括但不限于由任何脚本资源教程错误导致的任何损失或损害.

  • 间接使用相关资源或者参照文章的任何用户,包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, 博客对于由此引起的任何隐私泄漏或其他后果概不负责.

  • 请勿将博客的任何内容用于商业或非法目的,否则后果自负.

  • 如果任何单位或个人认为该博客的任何内容可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明至admin@proyy.com.我们将在收到认证文件后删除相关内容.

  • 任何以任何方式查看此博客的任何内容的人或直接或间接使用该博客的任何内容的使用者都应仔细阅读此声明。博客保留随时更改或补充此免责声明的权利。一旦使用并复制了博客的任何内容,则视为您已接受此免责声明.

您必须在下载后的24小时内从计算机或手机中完全删除以上内容.

您使用或者复制了本博客的任何内容,则视为已接受此声明,请仔细阅读


更多福利请关注一一网络微信公众号或者小程序

一一网络微信公众号
打个小广告,宝塔服务器面板,我用的也是,很方便,重点是免费的也能用,没钱太难了,穷鬼一个,一键全能部署及管理,送你3188元礼包,点我领取https://www.bt.cn/?invite_code=MV9kY3ZwbXo=


一一网络 » Python OpenCV 边缘滤波保留(EPF)

发表评论

发表评论

一一网络-提供最优质的文章集合

立即查看 了解详情