opencv图像处理-卷积

     卷积操作是图像变换的基础。

     抽象的说,卷积这个术语意味着我们对图像的每一个部分所做的操作。从这个意义上讲,我们所熟悉的很多图像变换操作可以被理解成普通卷积的特殊情况。一个特殊的卷积所实现的功能是由所用的卷积核的形式决定的。这个核本质上是一个大小固定,由数值参数构成的数组,数组的标定点通常位于数组的中心。数组的大小被称为核支撑。单就技术而言,核支撑实际上仅仅由核数组的非零部分组成。

下面的卷积示例描述了以数组中心为标定点的3×3卷积核。若要计算一个特定点的卷积值,首先将核的标定点定位到图像的第一个像素点,核的其余元素覆 盖图像中其相对应的局部像素点。对于每一个核点,我们可以得到这个点的核的值以及图像中相应图像点的值。将这些值相乘并求和,并将这个
结果放置在与输入图像标定点所相对应的位置。通过在整个图像上扫描卷积核,对图像的每个点重复此操作。

   卷积示例:
              3 * 3 的像素区域R与卷积核G
的卷积运算:
              R5(中心像素)=R1G1 + R2G2 + R3G3 + R4G4 + R5G5 + R6G6 + R7G7 + R8G8 + R9G9
            

opencv中对图像做卷积的函数

 
  
void cvFilter2D( const CvArr* src, CvArr* dst,
                 const CvMat* kernel,
                 CvPoint anchor=cvPoint(-1,-1));
#define cvConvolve2D cvFilter2D

src
输入图像.
dst
输出图像.
kernel
卷积核, 单通道浮点矩阵. 如果想要应用不同的核于不同的通道,先用  cvSplit 函数分解图像到单个色彩通道上,然后单独处理。
anchor
核的锚点表示一个被滤波的点在核内的位置。 锚点应该处于核内部。缺省值 (-1,-1) 表示锚点在核中心。
函数  cvFilter2D 对图像进行线性滤波,支持 In-place 操作。当核运算部分超出输入图像时,函数从最近邻的图像内部象素差值得到边界外面的象素值。

#include "cv.h"  
#include "highgui.h"  
#include   
int main()  
{  
    IplImage *src=0;
    IplImage*dst =0;
    IplImage*dst2=0;  
    float k[9]={  
        1,2,1,
        2,4,2,
        1,2,1};  //高斯卷积3*3的核

        for(int i = 0 ; i< 9;i++){
            k[i] = float(k[i]/10);
        }
        CvMat Km;  
        Km = cvMat(3,3,CV_32F,k);  

        float k2[25] = {
           1, 2, 3, 2, 1,
           2, 5, 6, 5, 2,  
           3, 6, 8, 6, 3,
           2, 5, 6, 5, 2,  
           1, 2, 3, 2, 1};//高斯卷积5*5的核
            for(int j = 0 ; j<25; j++){
                k2[j] = float(k2[j]/30);
            }
            CvMat Km2;
            Km2 = cvMat(5,5,CV_32F,k2);
            src=cvLoadImage("4.jpg");
            dst=cvCloneImage(src);  //使用cvCloneImage时,dst无需初始化,直接复制
            dst2 = cvCloneImage(src);
            cvNamedWindow("src",CV_WINDOW_AUTOSIZE);  
            cvNamedWindow("filter3*3",CV_WINDOW_AUTOSIZE);
            cvNamedWindow("filter5*5",CV_WINDOW_AUTOSIZE);

            cvShowImage("src",src);  

            cvFilter2D(src,dst,&Km,cvPoint(-1,-1));  
            cvFilter2D(src, dst2, &Km2,cvPoint(-1,-1));
            //卷积本身公式比较复杂,但是经过舍去高阶小量,简化后成为模板操作
            cvShowImage("filter3*3",dst);  
            cvShowImage("filter5*5", dst2);
            cvWaitKey(0);  
            cvReleaseImage(&src);  
            cvReleaseImage(&dst);  
            cvReleaseImage(&dst2);
            cvDestroyAllWindows();
            return 0;  
}

测试原图:
opencv图像处理-卷积_第1张图片
卷积结果:
 
  
 
  

最后,改变高斯核的数值和大小,结果将不同。



你可能感兴趣的:(opencv,图像处理)