OpenCV-Filter篇

《OpenCV 2 Computer Vision Application Programming Cookbook》
   Chapter 6 Filtering the Images

  1. 滤波器。第一次接滤波器的概念,是在大二的电子设计实验课和信号与系统这两门课上。顾名思义,滤波,就是将信号的某些个频段的波给去掉,比如说像低通滤波器(low-pass filter),就是将高频段的波去掉,只允许低频波通过。对应到图像处理上,就是去观察图像的各个像素值的变化和分布。比如说,一副画有天空的图片,其大部分颜色都是蓝色,所以其像素变化小,可以归到“低频段”;相反的,一副画有各种场景、人物、物体的图像,其像素种类多、变化快,相对的就可以归到“高频段”了。工程上将这种方法叫做频域(frequency domain)分析,而在图像处理上叫做空间域(spatial domain)分析。这也是工程概念在图像处理上的一个典型应用。
  2. 卷积。在大二的复变函数和信号与系统这两门课上学过。不过因为遗忘再加上当年没学好,所以在看这章的时候相对来说有些吃力。在这里,卷积是图像处理中好多变换的基础,而其功能的实现主要是由其卷积核的形式来决定的。这个核本质上是一个大小固定、由数值参数参数组成的一个数组,数组的参考点(anchor pointer)通常位于数组的中心。以一个3*3卷积核为例:若要计算一个特定点的倦极值,将核的参考点与该点对应,核的其余元素与特定点周围的像素一一对应,将这些值相乘求和,并将结果放到参考点所对应点的位置。通过在整个图像上扫描卷积核,就可以实现对图像所有像素值的卷积操作从而实现莫种图像变换。
  3. Sobel Filter:求导(近似)。参考《学习OpenCV》P171:Sobel导数并不是真正的导数,因为Sobel导数定义在一个离散空间之上。Sobel算子真正表示的多项式拟合,也就是说,x方向上的二阶Sobel导数并不是真正的导数。它是对抛物线函数的局部拟合。这么理解,导数的大小表示的数值变化的程度,对应到图像处理上,就是反映各个像素值变化的快慢了(高数不好,先这么理解了)。
 
 4.   Laplace变换,实现类似二阶Sobel导数。

下面是一个Sobel函数的简单应用(边缘检测)
边缘一般是图像变化较快的“频段”,利用Sobel的方向性和高通性便可以很快的检测到图像的边缘了。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//Chapter 6:Filtering the image
//By Steven 2012.11.13
 
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
 
using  namespace  cv;
using  namespace  std;
 
//using directional filter to detect edges
int  main()
{
     cv::Mat image=cv::imread( "D:\\opencvStudy\\pic\\boldt.jpg" );
     if (!image.data)
         std::cout<< "Error loading the picture" <<std::endl;
 
     cv::Mat soble_x,soble_y;
     cv::Sobel(image,soble_x,CV_16S,1,0);
     cv::Sobel(image,soble_y,CV_16S,0,1);
     cv::Mat soble;
     //compute the L1 norm
     soble= abs (soble_y)+ abs (soble_x);
 
     //find sobel max value
     double  sobmin,sobmax;
     cv::minMaxLoc(soble,&sobmin,&sobmax);
     //vonvert to 8-bit image
     //sobelimage=-alpha*sobel+255;
     cv::Mat sobelImage;
     soble.convertTo(sobelImage,CV_8U,-255./sobmax,255);
     
     imshow( "soble" ,soble);
 
     //cv::threshold(sobelImage,sobelImage,200,255,cv::THRESH_BINARY);
     imshow( "sobelImage" ,sobelImage);
     waitKey(0);
     return  0;
}
图片
 
数学功底不好,只能理解这么多了。有待继续学习。
Steven
2012.11.14

转载于:https://www.cnblogs.com/steven-blog/archive/2012/12/14/2919267.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值