什么是内核?
内核本质上是固定大小的数值系数阵列以及该阵列中的锚点,其通常位于中心。
卷积如何与内核一起工作?
假设您想知道图像中特定位置的结果值。 卷积的值按以下方式计算:
- 将内核锚点放在确定的像素上,内核的其余部分覆盖图像中相应的局部像素。
- 将核系数乘以相应的图像像素值并对结果求和。
- 将结果放在输入图像中锚点的位置。
- 通过在整个图像上扫描内核,对所有像素重复此过程。
代码
代码的流程
- 加载图像
- 执行标准化的框过滤器。 例如,对于size size = 3的内核,内核将是:
- 该程序将使用大小为3,5,7,9和11的内核执行过滤操作。
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
using namespace cv;
/* @function main */
int main ( int argc, char** argv )
{
Mat src, dst;
Mat kernel;
Point anchor;
double delta;
int ddepth;
int kernel_size;
char* window_name = "filter2D Demo";
int c;
src = imread( argv[1] );
if( !src.data )
{ return -1; }
namedWindow( window_name, WINDOW_AUTOSIZE );
anchor = Point( -1, -1 );
delta = 0;
ddepth = -1;
int ind = 0;
while( true )
{
c = waitKey(500);
if( (char)c == 27 )
{ break; }
kernel_size = 3 + 2*( ind%5 );
kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);
filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );
imshow( window_name, dst );
ind++;
}
return 0;
}
解释
- 加载图像
- 创建一个窗口以显示结果
- 初始化线性过滤器的参数
- 执行无限循环更新内核大小并将我们的线性过滤器应用于输入图像。 让我们更详细地分析一下。
- 首先,我们定义我们的过滤器将要使用的内核。 这里是:
- 设置内核后,我们可以使用函数cv :: filter2D生成过滤器:
- 参数表示:
- src:源图像
- dst:目标图像
- ddepth:dst的深度。 负值(例如-1)表示深度与源相同
- kernel:要通过映像扫描的内核
- anchor:锚点相对于其内核的位置。 位置Point(-1,-1)默认表示中心。
- delta:卷积过程中要添加到每个像素的值。 默认情况下为0
- BORDER_DEFAULT:我们默认使用此值
- 我们的程序将实现一个while循环,每500 ms我们的过滤器的内核大小将在指定的范围内更新。