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
posted @ 2012-12-14 18:41  StevenMeng  阅读(1841)  评论(0编辑  收藏  举报