opencv图像处理-卷积

时间:2023-02-07 12:14:33

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

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

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

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

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 <stdio.h>  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图像处理-卷积
卷积结果:
 
 
 
opencv图像处理-卷积

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