网站建设概述,济南市住房城乡建设网,杭州网站建设hzfwwl,上海企业体检OpenCV12-图像卷积 图像卷积 图像卷积
OpenCV中提供了filt2D()函数用于实现图像和卷积模板之间的卷积运算#xff1a;
void filter2D(InputArray src, // 输入图像OutputArray dst, // 输出图像int ddepth, // 输出图像数据类型#xff08;深度#xff09;#xff… OpenCV12-图像卷积 图像卷积 图像卷积
OpenCV中提供了filt2D()函数用于实现图像和卷积模板之间的卷积运算
void filter2D(InputArray src, // 输入图像OutputArray dst, // 输出图像int ddepth, // 输出图像数据类型深度当为-1时根据输入图像类型自动选择。InputArray kernel, // 卷积核CV_32FC1 Point anchor Point(-1,-1), // 核的基准点默认值代表内核基准点位于kernel的中心位置。double delta 0, // 偏移值卷积结果加上偏移值 int borderType BORDER_DEFAULT // 像素边界外推标志
);第6个参数是像素边界外推标志在 图像几何变换 一文中讲解 wrapAffine() 仿射变换时第一次遇到在这里我们体会到了什么是像素边界外推就是对图像的边界使用卷积核处理时边界外面没有与卷积核对应的元素这是如果要对边界元素卷积则需要填充一些值填充值的方法如下
/*
BORDER_CONSTANT用特定值填充如用i填充iiiiii|abcdefgh|iiiiiii
BORDER_REPLICATE两端复制填充如两端用a和h填充aaaaaa|abcdefgh|hhhhhhh
BORDER_REFLECT倒序填充
BORDER_WRAP正序填充
BORDER_REFLECT_101不包含边界值的倒序填充
BORDER_TRANSPARENT随即填充
BORDER_REFLECT101、BORDER_DEFAULT同BORDER_REFLECT_101
BORDER_ISOLATED不关心感兴趣区域之外的部分
*/
enum BorderTypes {BORDER_CONSTANT 0, //! iiiiii|abcdefgh|iiiiiii with some specified iBORDER_REPLICATE 1, //! aaaaaa|abcdefgh|hhhhhhhBORDER_REFLECT 2, //! fedcba|abcdefgh|hgfedcbBORDER_WRAP 3, //! cdefgh|abcdefgh|abcdefgBORDER_REFLECT_101 4, //! gfedcb|abcdefgh|gfedcbaBORDER_TRANSPARENT 5, //! uvwxyz|abcdefgh|ijklmnoBORDER_REFLECT101 BORDER_REFLECT_101, //! same as BORDER_REFLECT_101BORDER_DEFAULT BORDER_REFLECT_101, //! same as BORDER_REFLECT_101BORDER_ISOLATED 16 //! do not look outside of ROI
};由于边界外没有任何图像信息因此可以使用 BORDER_CONSTANT 边界填充0。
下面的例子中卷积结果偏移了2。归一化后的矩阵中每个元素的数值都在一定范围内。再利用相同的卷积模板对彩色图像进行卷积虽然卷积前后图像内容一致但是图像整体变得模糊一些。
#include opencv2/core/utils/logger.hpp
#include opencv2/opencv.hppusing namespace cv;
using namespace std;int main()
{cout OpenCV Version: CV_VERSION endl;utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);//待卷积矩阵uchar points[25] {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};Mat img(5, 5, CV_8UC1, points);//卷积模板Mat kernel (Mat_float(3, 3) 1, 2, 1,2, 0, 2,1, 2, 1);Mat kernel_norm kernel / 12; //卷积模板归一化//未归一化卷积结果和归一化卷积结果Mat result, result_norm;filter2D(img, result, CV_32F, kernel, Point(-1, -1), 2, BORDER_CONSTANT);filter2D(img, result_norm, CV_32F, kernel_norm, Point(-1, -1), 2, BORDER_CONSTANT);cout result: endl result endl;cout result_norm: endl result_norm endl;//图像卷积Mat lena imread(lena.png);if (lena.empty()){cout 请确认图像文件名称是否正确 endl;return -1;}Mat lena_fillter;filter2D(lena, lena_fillter, -1, kernel_norm, Point(-1, -1), 2, BORDER_CONSTANT);imshow(lena_fillter, lena_fillter);imshow(lena, lena);int k waitKey(0); // Wait for a keystroke in the windowreturn 0;
}输出
result:
[25, 38, 46, 54, 39;54, 86, 98, 110, 78;94, 146, 158, 170, 118;134, 206, 218, 230, 158;95, 158, 166, 174, 109]
result_norm:
[3.9166665, 5, 5.666667, 6.3333335, 5.0833335;6.3333335, 9, 10.000001, 11.000001, 8.333333;9.666667, 14, 15, 16, 11.666668;13, 19, 20.000002, 21.000002, 15.000001;9.750001, 15, 15.666667, 16.333336, 10.916667]