卷积:
一个特殊卷积所实现的功能由其卷积和的形式决定,这个核本质上是一个大小固定,由数组参数构成的数组。数组参数的参考点位于数组的中心。数组的大小称为核支撑。
Filter2D
对图像做卷积
void cvFilter2D( const CvArr* src, CvArr* dst, const CvMat* kernel, CvPoint anchor=cvPoint(-1,-1));
输入图像.
dst
输出图像.
kernel
卷积核, 单通道浮点矩阵. 如果想要应用不同的核于不同的通道,先用 cvSplit 函数分解图像到单个色彩通道上,然后单独处理。
anchor
核的锚点表示一个被滤波的点在核内的位置。 锚点应该处于核内部。缺省值 (-1,-1) 表示锚点在核中心。
函数 cvFilter2D 对图像进行线性滤波,支持 In-place 操作。当核运算部分超出输入图像时,函数从最近邻的图像内部象素插值得到边界外面的象素值。
实现代码:
/*
* 图像卷积
*/
#include "highgui.h"
#include "cv.h"
void doFilter(IplImage* img)
{
IplImage* dst = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);
float ke[9] = {1.0, -2.0, 1.0,
2.0, -4.0, 2.0,
1.0, -2.0, 1.0
};
CvMat km;
km = cvMat(3,3, CV_32FC1,ke);
cvFilter2D(img, dst, &km, cvPoint(-1,-1));
cvNamedWindow("Filter");
cvShowImage("Filter", dst);
cvReleaseImage(&dst);
cvWaitKey(0);
cvDestroyWindow("Filter");
}
结果:
卷积边界
CopyMakeBorder
复制图像并且制作边界。
void cvCopyMakeBorder( const CvArr* src, CvArr* dst, CvPoint offset, int bordertype, CvScalar value=cvScalarAll(0) );
输入图像。
dst
输出图像。
offset
输入图像(或者其ROI)欲拷贝到的输出图像长方形的左上角坐标(或者左下角坐标,如果以左下角为原点)。长方形的尺寸要和原图像的尺寸的ROI分之一匹配。
bordertype
已拷贝的原图像长方形的边界的类型:
IPL_BORDER_CONSTANT - 填充边界为固定值,值由函数最后一个参数指定。IPL_BORDER_REPLICATE -边界用上下行或者左右列来复制填充。(其他两种IPL边界类型, IPL_BORDER_REFLECT 和IPL_BORDER_WRAP现已不支持)。
value
如果边界类型为IPL_BORDER_CONSTANT的话,那么此为边界像素的值。
函数cvCopyMakeBorder拷贝输入2维阵列到输出阵列的内部并且在拷贝区域的周围制作一个指定类型的边界。函数可以用来模拟和嵌入在指定算法实现中的边界不同的类型。例如:和opencv中大多数其他滤波函数一样,一些形态学函数内部使用复制边界类型,但是用户可能需要零边界或者填充为1或255的边界。
代码实现:
/*
* 卷积边界
*/
#include "highgui.h"
#include "cv.h"
void doBorder(IplImage* img)
{
IplImage* dst1 = cvCreateImage(cvSize(img->width+30, img->height+30), IPL_DEPTH_8U, 3);
IplImage* dst2 = cvCreateImage(cvSize(img->width+30, img->height+30), IPL_DEPTH_8U, 3);
cvCopyMakeBorder(img, dst1, cvPoint(1,1), IPL_BORDER_CONSTANT);
cvCopyMakeBorder(img, dst2, cvPoint(1,1), IPL_BORDER_REPLICATE);
cvNamedWindow("dst1");
cvNamedWindow("dst2");
cvShowImage("dst1", dst1);
cvShowImage("dst2", dst2);
cvWaitKey(0);
cvReleaseImage(&dst1);
cvReleaseImage(&dst2);
}
结果: