OpenCV2马拉松第5圈——线性滤波
收入囊中
Vision: Algorithms and ApplicationsのImage processing中都有讲过
- 相关和卷积工作原理
- 边界处理
- 滤波器的工作原理
- 会使用均值滤波,高斯滤波
- 使用自己创造的核函数进行双线性滤波
- 可分离的滤波(加速)
葵花宝典
- 0填充。非常easy的处理方式
- 常数填充
- 夹取填塞(clamp),不断地复制边缘像素的值
- 重叠填塞(wrap),以环状形态围绕图像进行循环
- 镜像填塞(mirror),像素围绕图像边界进行镜像反射
- 延长(extend)。通过在边缘像素值中减去镜像信号的方式延长信号
/*
Various border types, image boundaries are denoted with '|' * BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh
* BORDER_REFLECT: fedcba|abcdefgh|hgfedcb
* BORDER_REFLECT_101: gfedcb|abcdefgh|gfedcba
* BORDER_WRAP: cdefgh|abcdefgh|abcdefg
* BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii with some specified 'i'
*/
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWJjZDE5OTI3MTln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
初识API
-
C++: void blur(InputArray src,
OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
-
- src – 原始图像
- dst – 输出图像
- ksize – 核函数大小
- anchor – 锚点,普通情况下默觉得(-1,-1)。意味着在中心进行卷积
- borderType – 边界类型
The function smoothes an image using the kernel:

高斯滤波。对去除正态分布的噪声非常实用
-
C++: void GaussianBlur(InputArray src,
OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )
-
- src – 输入图像
- dst – 输出图像
- ksize – 核大小
- sigmaX – 控制幅度的參数(大家应该都学过或看过高斯函数吧,比方在正态分布中),假设sigmaX,sigmaY都为0,则由核的高度宽度自己计算
- sigmaY – 二维高斯函数有两个方向能够控制幅度。或这个不设置则和X一样
- borderType – 边界类型
用自己的核函数进行滤波
-
C++: void filter2D(InputArray src,
OutputArray dst, int ddepth, InputArray kernel, Point anchor=Point(-1,-1), double delta=0, intborderType=BORDER_DEFAULT )
-
- src – 输入图像.
- dst – 输出图像.
- depth – ddepth=-1,输出图像具有和输入图像一样的depth
- kernel – 核函数,单通道浮点矩阵
- anchor – 同之前
- delta – 可选,直接加到输出图像
- borderType – 边界类型
荷枪实弹
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWJjZDE5OTI3MTln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
Mat src,dst;
int i = 1;
static void change_dst(int, void*)
{
if(i%2 == 0)i++;
blur( src, dst, Size( i, i ), Point(-1,-1));
imshow("dstImage", dst);
}
int main( int, char** argv )
{
src = imread( argv[1] );
namedWindow("srcImage", 1);
namedWindow("dstImage", 1);
createTrackbar( "mean filter:", "dstImage", &i, 20, change_dst);
change_dst(0, 0);
imshow("srcImage", src);
waitKey();
return 0;
}
使用高斯滤波
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWJjZDE5OTI3MTln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
Mat src,dst;
int i = 1;
static void change_dst(int, void*)
{
if(i%2 == 0)i++;
GaussianBlur( src, dst, Size( i, i ), 0, 0 );
imshow("dstImage", dst);
}
int main( int, char** argv )
{
src = imread( argv[1] );
namedWindow("srcImage", 1);
namedWindow("dstImage", 1);
createTrackbar( "gauss filter:", "dstImage", &i, 20, change_dst);
change_dst(0, 0);
imshow("srcImage", src);
waitKey();
return 0;
}
使用自己定义线性滤波
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
Mat src,dst,Kernel;
int main( int, char** argv )
{
src = imread( argv[1] );
namedWindow("srcImage", 1);
namedWindow("dstImage", 1);
Kernel = (Mat_<double>(3,3) << 1, 2, 1, 2, 4, 2, 1, 2, 1)/16;
filter2D(src, dst, -1 , Kernel, Point(-1,-1));
imshow("dstImage", dst);
imshow("srcImage", src);
waitKey();
return 0;
}
举一反三
K =vhT
将卷积核K拆分成列向量v和行向量h
-
C++: void sepFilter2D(InputArray src,
OutputArray dst, int ddepth, InputArray kernelX, InputArray kernelY, Point anchor=Point(-1,-1), doubledelta=0, int borderType=BORDER_DEFAULT )
-
- src – Source image.
- dst – Destination image of the same size and the same number of channels as src .
- ddepth –
- Destination image depth. The following combination of src.depth() and ddepth are
supported: -
- src.depth() = CV_8U, ddepth =
-1/CV_16S/CV_32F/CV_64F - src.depth() = CV_16U/CV_16S, ddepth =
-1/CV_32F/CV_64F - src.depth() = CV_32F, ddepth =
-1/CV_32F/CV_64F - src.depth() = CV_64F, ddepth =
-1/CV_64F
- src.depth() = CV_8U, ddepth =
when ddepth=-1, the destination image will have the same depth
as the source. - Destination image depth. The following combination of src.depth() and ddepth are
- kernelX – Coefficients for filtering each row.
- kernelY – Coefficients for filtering each column.
- anchor – Anchor position within the kernel. The default value
means
that the anchor is at the kernel center. - delta – Value added to the filtered results before storing them.
- borderType – Pixel extrapolation method. See
highlight=sepfilter2d#int%20borderInterpolate(int%20p,%20int%20len,%20int%20borderType)" rel="nofollow" title="int borderInterpolate(int p, int len, int borderType)" style="color:rgb(0,144,217);text-decoration:none;">borderInterpolate()
for
details.
參数基本没什么好讲,都是一样的,以下我们用这个函数来进行高斯卷积(滤波)
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
Mat src,dst,kernelX,kernelY;
int main( int, char** argv )
{
src = imread( argv[1] );
namedWindow("srcImage", 1);
namedWindow("dstImage", 1);
kernelX = (Mat_<double>(1,5) << 1,4,6,4,1)/16;
kernelY = (Mat_<double>(1,5) << 1,4,6,4,1)/16;
sepFilter2D(src, dst, -1, kernelX, kernelY);
imshow("dstImage", dst);
imshow("srcImage", src);
waitKey();
return 0;
}
OpenCV2马拉松第5圈——线性滤波的更多相关文章
- OpenCV2马拉松第15圈——边缘检測(Laplace算子,LOG算子)
收入囊中 拉普拉斯算子 LOG算子(高斯拉普拉斯算子) OpenCV Laplacian函数 构建自己的拉普拉斯算子 利用拉普拉斯算子进行图像的锐化 葵花宝典 在OpenCV2马拉松第14圈--边缘检 ...
- OpenCV2马拉松第17圈——边缘检測(Canny边缘检測)
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g 收入囊中 利用OpenCV Canny函数进行边缘检測 掌握Canny算法基本理论 ...
- OpenCV2马拉松第22圈——Hough变换直线检測原理与实现
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/27220445 收入囊中 Hough变换 概率Ho ...
- OpenCV2马拉松第14圈——边缘检測(Sobel,prewitt,roberts)
收入囊中 差分在边缘检測的角色 Sobel算子 OpenCV sobel函数 OpenCV Scharr函数 prewitt算子 Roberts算子 葵花宝典 差分在边缘检測究竟有什么用呢?先看以下的 ...
- OpenCV2马拉松第2圈——读写图片
收入囊中 用imread读取图片 用nameWindow和imshow展示图片 cvtColor彩色图像灰度化 imwrite写图像 Luv色彩空间转换 初识API 图像读取接口 image = im ...
- OpenCV2马拉松第10圈——直方图反向投影(back project)
收入囊中 灰度图像的反向投影 彩色图像的反向投影 利用反向投影做object detect 葵花宝典 什么是反向投影?事实上没有那么高大上! 在上一篇博文学到,图像能够获得自己的灰度直方图. 反向投影 ...
- OpenCV2马拉松第12圈——直方图比較
收入囊中 使用4种不同的方法进行直方图比較 葵花宝典 要比較两个直方图, 首先必需要选择一个衡量直方图相似度的对照标准.也就是先说明要在哪个方面做对照. 我们能够想出非常多办法,OpenCV採用了下面 ...
- openCV2马拉松第19圈——Harris角点检測(自己实现)
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/26824529 收入囊中 使用OpenCV的con ...
- openCV2马拉松第18圈——坐标变换
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g 收入囊中 仿射变换 坐标映射 利用坐标映射做一些效果,例如以下 watermark/ ...
随机推荐
- WCF的三种模式
WCF通信的3种模式 1.正常模式:客户端调取接口->等待服务响应->接受响应->执行客户端后面代码(wcf服务有入参,有返回值) 2.数据报模式:客户端调取接口->不等待响应 ...
- 配置中心:Nacos, Apollo, Consul, Etcd
Nacos, Apollo, Consul, Etcd 服务.应用不同粒度的配置更丰富的路由规则集中式管理的动态参数规则
- springMVC从前端接受boolean类型的属性失败的问题
springMVC从前端接收到的实体又一个boolean类型的属性,发现不管前端怎么操作,后台接收到的值都是false. 问题出现原因: eclipse在给实体属性生成getter和setter的时候 ...
- Spring配置问题:The prefix "util" for element "util:map" is not bound.
在spring的头部文件中没有引入: xmlns:util=”http://www.springframework.org/schema/util” 原文:https://blog.csdn.net/ ...
- 虚拟机 ----最小安装无法使用vim编辑器
解决办法:安装 yum -y install vim-enhanced.x86_64 帮助网址http://blog.csdn.net/yexudengzhidao/article/details/7 ...
- 转Linux 下用alias 设置命令别名快速切换常用命令
https://blog.csdn.net/u012830148/article/details/80618616 在linux下开发,经常需要切换目录,如果目录很长则切换起来非常的麻烦,针对一些常用 ...
- stream2
import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.function.B ...
- Mybatis学习笔记1 - Hello World
1.pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...
- [转]使用jquery dataTable
本文转自:http://blog.csdn.net/llhwin2010/article/details/8663753 jQuery 的插件 dataTables 是一个优秀的表格插件,提供了针对表 ...
- WCF:无法满足对安全令牌的请求,因为身份验证失败。
服务端和客户端如果有认证的话的这样: <wsHttpBinding> <binding name="WSHttpBinding_IService1" closeT ...
与数据列表的卷积.


