Python-OpenCV中的filter2D()函数
使用自定义内核对图像进行卷积。该功能将任意线性滤波器应用于图像。支持就地操作。当光圈部分位于图像外部时,该功能会根据指定的边框模式插入异常像素值。
语法
函数原型:
dst=cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
参数:
参数 | 描述 |
src | 原图像 |
dst | 目标图像,与原图像尺寸和通过数相同 |
ddepth | 目标图像的所需深度 |
kernel | 卷积核(或相当于相关核),单通道浮点矩阵;如果要将不同的内核应用于不同的通道,请使用拆分将图像拆分为单独的颜色平面,然后单独处理它们。 |
anchor | 内核的锚点,指示内核中过滤点的相对位置;锚应位于内核中;默认值(-1,-1)表示锚位于内核中心。 |
detal | 在将它们存储在dst中之前,将可选值添加到已过滤的像素中。类似于偏置。 |
borderType | 像素外推法,参见BorderTypes |
该函数实际计算的是相关性,而不是卷积
$$\texttt{dst} (x,y) = \sum _{ \stackrel{0\leq x' < \texttt{kernel.cols},}{0\leq y' < \texttt{kernel.rows}} } \texttt{kernel} (x',y')* \texttt{src} (x+x'- \texttt{anchor.x} ,y+y'- \texttt{anchor.y} )$$
在内核足够大(~11x11或者更大)的时候,该函数使用DFT算法,对于小内核则直接计算。
也可见,anchor相当于坐标轴平移。
其中ddepth表示目标图像的所需深度,它包含有关图像中存储的数据类型的信息,可以是unsigned char(CV_8U),signed char(CV_8S),unsigned short(CV_16U)等等...
Input depth (src.depth()) | Output depth (ddepth) |
---|---|
CV_8U | -1/CV_16S/CV_32F/CV_64F |
CV_16U/CV_16S | -1/CV_32F/CV_64F |
CV_32F | -1/CV_32F/CV_64F |
CV_64F | -1/CV_64F |
Note:当ddepth=-1时,表示输出图像与原图像有相同的深度。
例子
图像内核是一个小矩阵,用于应用您可能在Photoshop或Gimp中找到的效果,例如模糊,锐化,轮廓或浮雕。它们还用于机器学习中的“特征提取”,这是一种用于确定图像最重要部分的技术。在这种情况下,该过程更普遍地称为“卷积”(参见:卷积神经网络)。
有许多有趣的内核,下面一一介绍:
1、模糊(blur)
模糊内核消除了相邻像素值之间的差异。内核如下:
0.0625 | 0.125 | 0.0625 |
0.125 | 0.25 | 0.125 |
0.0625 | 0.125 | 0.125 |
代码:
import cv2
import numpy as np def solve(): src = cv2.imread("./Pictures/car001.jpg")
if src is None:
return -1 kernel = np.array((
[0.0625, 0.125, 0.0625],
[0.125, 0.25, 0.125],
[0.0625, 0.125, 0.0625]), dtype="float32") dst = cv2.filter2D(src, -1, kernel)
htich = np.hstack((src, dst))
cv2.imwrite("./Pictures/car.jpg", htich)
cv2.imshow('merged_img', htich)
cv2.waitKey(0) return 0 if __name__ == "__main__":
solve()
效果:
2、索贝尔(sobel)
sobel内核用于仅显示特定方向上相邻像素值的差异,分为left sobel、right sobel(检测梯度的水平变化)、top sobel、buttom sobel(检测梯度的垂直变化)。
例如,buttom sobel
-1 | -2 | -1 |
0 | 0 | 0 |
1 | 2 | 1 |
代码与上面类似,只需修改krenel的值。
3、浮雕(emboss)
通过强调像素的差在给定方向的Givens深度的错觉。在这种情况下,沿着从左上到右下的直线的方向。
-2 | -1 | 0 |
-1 | 1 | 1 |
0 | 1 | 2 |
效果:
4、大纲(outline)
一个轮廓内核(也称为“边缘”的内核)用于突出显示的像素值大的差异。具有接近相同强度的相邻像素旁边的像素在新图像中将显示为黑色,而与强烈不同的相邻像素相邻的像素将显示为白色。
-1 | -1 | -1 |
-1 | 8 | -1 |
-1 | -1 | -1 |
效果:
5、锐化(sharpen)
该锐化内核强调在相邻的像素值的差异。这使图像看起来更生动。
0 | -1 | 0 |
-1 | 5 | -1 |
0 | -1 | 0 |
效果:
6、拉普拉斯算子(laplacian operator)
拉普拉斯算子可以用于边缘检测,对于检测图像中的模糊也非常有用。
0 | 1 | 0 |
1 | -4 | 1 |
0 | 1 | 0 |
效果:
7、分身(identity)
这个非常简单,就是原图(不考虑边界时),How boring!
0 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
拓展部分
正如您在本博文中所收集的那样,我们必须 手动定义每个内核以应用各种操作,例如平滑,锐化和边缘检测。
如何定义内核达到你想要的效果,这并不是一件简单的事情。
现在有一种神经网络——CNN,通过应用卷积滤波器,非线性激活函数,汇集和反向传播,CNN能够学习过滤器(的权重),可以检测网络较低层中的边缘和类似blob的结构 - 然后使用边缘和结构作为构建块,最终在网络的更深层中检测更高级别的对象(即,面部,猫,狗,杯等)。这样就不必手动定义过滤器了。
参考链接:
1、Depth combination https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#filter_depths
2、cv2.filter2d()opencv中ddepth参数的解释?https://stackoverflow.com/questions/43392956/explanation-for-ddepth-parameter-in-cv2-filter2d-opencv
3、Image-kernels Demohttp://setosa.io/ev/image-kernels/
Python-OpenCV中的filter2D()函数的更多相关文章
- OpenCV中的绘图函数-OpenCV步步精深
OpenCV 中的绘图函数 画线 首先要为画的线创造出环境,就要生成一个空的黑底图像 img=np.zeros((512,512,3), np.uint8) 这是黑色的底,我们的画布,我把窗口名叫做i ...
- 转载 为什么print在Python 3中变成了函数?
转载自编程派http://codingpy.com/article/why-print-became-a-function-in-python-3/ 原作者:Brett Cannon 原文链接:htt ...
- cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测
参考文献----------OpenCV-Python-Toturial-中文版.pdf 参考博客----------http://www.bubuko.com/infodetail-2498014. ...
- 嵌入Python系列 | 调用Python模块中无参数函数
开发环境 Python版本:3.6.4 (32-bit) 编辑器:Visual Studio Code C++环境:Visual Studio 2013 需求说明 在用VS2013编写的Win32程序 ...
- python+opencv中最近出现的一些变化( OpenCV 官方的 Python tutorial目前好像还没有改过来?) 记一次全景图像的拼接
最近在学习过程中发现opencv有了很多变动, OpenCV 官方的 Python tutorial目前好像还没有改过来,导致大家在学习上面都出现了一些问题,现在做一个小小的罗列,希望对大家有用 做的 ...
- python列表中的pop函数
再python的列表中,有许多的内置方法,而在这里我主要向大家介绍一下pop函数. pop函数主要是用于删除列表中的数据.而其删除值时会返回删除的值.如果没有参数传入时, 则会默认认为删除列表的最后一 ...
- OpenCV中的新函数connectedComponentsWithStats使用
主要内容:对比新旧函数,用于过滤原始图像中轮廓分析后较小的区域,留下较大区域. 关键字 :connectedComponentsWithStats 在以前,常用的方法是"是先调用 cv ...
- python 类中的某个函数作为装饰器
在python的类中,制作一个装饰器的函数, class A: def wrapper(func): ###装饰器 def wrapped(self,*arg,**kwargs) ... return ...
- 5、opencv中的绘图函数
1.目标 a.学习使用 OpenCV 绘制不同几何图形 b. 你将会学习到这些函数: cv2.line(), cv2.circle(), cv2.rectangle(),cv2.ellipse(),c ...
随机推荐
- Pure CSS 的网格布局(比bootstrap小很多且易扩展的css UI)
(转自百度经验)http://jingyan.baidu.com/article/48a42057c44fdba9242504dd.html Pure是一个简单.实用的CSS框架,鉴于目前网上对pur ...
- 如何使用Node.js搭建一个服务器
在node环境中运行下面的代码 "use strict"; const http = require("http"), path = require(" ...
- Java 为程序创建日志系统
使用JAVA创建日志系统有两种方法 1.使用log4j操作日志文件 2.使用系统重定向输出日志信息 方法1:使用log4j操作日志文件(可使用jar或者xml) 步骤1:下载log4j.jar 下载地 ...
- Spring - SpringIOC容器详解
一.什么是Spring IOC: Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想. 在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是 ...
- 2017EIS高校运维大赛ctf wirteup
php代码审计 题目很简单GET传入参数args然后eval(var_dump($$args))直接传入全局变量GLOBALS就能执行 php是最好的语言 .bak泄露拿到源码 <?php $v ...
- BZOJ 4551: [Tjoi2016&Heoi2016]树 并查集(&&图论?)
反向操作,先把所有的标记都打上(记得统计标记的数目),然后依次撤销,合并到自己的上一个点pre,即fa[u]=getf(pre[u]) #include<cstdio> #include& ...
- 紫书140例题6-2 铁轨&&UVa514
某城市有一个火车站,铁轨铺设如图6-1所示.有n节车厢从A方向驶入车站,按进站顺序编号为1~n.你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨,并驶出车站.例如,出栈顺序(5 4 1 2 ...
- yii2.0下,JqPaginator与load实现无刷新翻页
JqPaginator下载地址http://jqpaginator.keenwon.com/ 控制器部分: <?php namespace backend\controllers; use co ...
- 【手撸一个ORM】第九步、orm默认配置类 MyDbConfiguration,一次配置,简化实例化流程
这个实现比较简单,事实上可配置的项目很多,如有需要,请读者自行扩展 using System; namespace MyOrm { public class MyDbConfiguration { p ...
- NET CORE 基础
NET CORE 基础管理系统 [SF]开源的.NET CORE 基础管理系统 - 安装篇 [SF]开源的.NET CORE 基础管理系统 -系列导航 1.开发必备工具 IDE:VS2017 运行 ...