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


                
            
        
浙公网安备 33010602011771号