文章目录
- 说明
- 内核
- 图片
- 锚点分析
- 测试代码
- 1. 锚点位置Point(-1, -1) = Point(1, 1)
- 2. 锚点位置Point(-1, 0) = Point(1, 0)
- 3. 锚点位置Point(-1, 1) = Point(1, 1)
- 4. 锚点位置Point(0, -1) = Point(0, 1)
- 5. 锚点位置Point(0, 0)
- 6. 锚点位置Point(0, 1)
- 7. 锚点位置Point(1, -1) = Point(1, 1)
- 8. 锚点位置Point(1, 0)
- 9. 锚点位置Point(1, 1)
- 参考链接
说明
- 使用OpenCV的filter2D函数观察内核锚点处于不同位置时的运算结果。填充方式使用BORDER_DEFAULT
边界填充说明filter2D函数说明 - 默认值为(-1,-1)说明位于kernel的中心位置==>查看源码opencv-2.4.9/modules/imgproc/src/precomp.hpp
static inline Point normalizeAnchor( Point anchor, Size ksize )
{
if( anchor.x == -1 )
anchor.x = ksize.width/2;
if( anchor.y == -1 )
anchor.y = ksize.height/2;
CV_Assert( anchor.inside(Rect(0, 0, ksize.width, ksize.height)) );
return anchor;
}
很容易看到,(-1,-1)的时候,其实对应的是(ksize.width/2,ksize.height/2),也就是kernel的中心,所以默认情况为(-1,-1)时,是kernel center.
最后一句是判断语句,CV_Assert(val),若val为假则报错,inside函数是判断anchor是否在矩形内部,即anchor是不是within the kernel
内核
2x2的全1内核
图片
为方便说明,我们事先进行边界填充,填充该条件下到最全的状态,即满足内核不同位置时填充出的图片皆为此图的子集
锚点分析
测试代码
public static void main(String[] args) {
//内核
Mat kernel = new Mat(new Size(2,2), CvType.CV_8UC1, new Scalar(255));
kernel.put(0,0, 1); kernel.put(0,1, 1);
kernel.put(1,0, 1); kernel.put(1,1, 1);
//图片
Mat src = new Mat(new Size(3,3), CvType.CV_8UC1, new Scalar(255));
src.put(0,0, 1); src.put(0,1, 2); src.put(0,2, 3);
src.put(1,0, 4); src.put(1,1, 5); src.put(1,2, 6);
src.put(2,0, 7); src.put(2,1, 8); src.put(2,2, 9);
//filter2D
Mat dst = new Mat();
Imgproc.filter2D(src, dst, -1, kernel, new Point(-1, -1), 0, Core.BORDER_DEFAULT);
System.out.println("-------------filter2D结果------------------");
for (int row = 0; row < dst.rows(); row++) {
for (int col = 0; col < dst.cols(); col++) {
System.out.print((int)dst.get(row, col)[0] + " ");
}
System.out.println();
}
}
1. 锚点位置Point(-1, -1) = Point(1, 1)
内核的(1, 1)对应图片的(0, 0)
蓝色为内核锚点为(-1,-1)时图片填充后的结果, 红色代表内核
图片以结果为例
= 5 * 1 + 4 * 1 + 2 * 1 + 1 * 1 = 12
= 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12
= 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
= 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
= 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
= 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
锚点位置Point(-1, -1)时程序输出
-------------filter2D结果------------------
12 12 16
12 12 16
24 24 28
2. 锚点位置Point(-1, 0) = Point(1, 0)
内核的(1, 0)对应图片的(0, 0)
蓝色为内核锚点为(-1,0)时图片填充后的结果, 红色代表内核
图片以结果为例
= 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
= 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
= 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
= 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
= 8 * 1 + 7* 1 + 5 * 1 + 4 * 1 = 24
= 7 * 1 + 8 * 1 + 4 * 1 + 5 * 1 = 24
锚点位置Point(-1, 0)时程序输出
-------------filter2D结果------------------
12 12 16
24 24 28
24 24 28
3. 锚点位置Point(-1, 1) = Point(1, 1)
内核的(1, 1)对应图片的(0, 0)
蓝色为内核锚点为(-1,1)时图片填充后的结果, 红色代表内核
图片以结果为例
= 5 * 1 + 4 * 1 + 2 * 1 + 1 * 1 = 12
= 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12
= 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
= 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
= 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
= 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
锚点位置Point(-1, 1)时程序输出
-------------filter2D结果------------------
12 12 16
12 12 16
24 24 28
4. 锚点位置Point(0, -1) = Point(0, 1)
内核的(0, 1)对应图片的(0, 0)
蓝色为内核锚点为(0,-1)时图片填充后的结果, 红色代表内核
图片以结果为例
= 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12
= 5 * 1 + 6 * 1 + 2 * 1 + 3 * 1 = 16
= 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
= 2 * 1 + 3 * 1 + 5 * 1 + 6 * 1 = 16
= 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
= 5 * 1 + 6 * 1 + 8 * 1 + 9 * 1 = 28
锚点位置Point(0, -1)时程序输出
-------------filter2D结果------------------
12 16 16
12 16 16
24 28 28
5. 锚点位置Point(0, 0)
内核的(0, 0)对应图片的(0, 0)
蓝色为内核锚点为(0,0)时图片填充后的结果, 红色代表内核
图片以结果为例
= 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
= 2 * 1 + 3 * 1 + 5 * 1 + 6 * 1 = 16
= 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
= 5 * 1 + 6 * 1 + 8 * 1 + 9 * 1 = 28
= 7 * 1 + 8 * 1 + 4 * 1 + 5 * 1 = 24
= 8 * 1 + 9 * 1 + 5 * 1 + 6 * 1 = 28
锚点位置Point(0, 0)时程序输出
-------------filter2D结果------------------
12 16 16
24 28 28
24 28 28
6. 锚点位置Point(0, 1)
内核的(0, 1)对应图片的(0, 0)
蓝色为内核锚点为(0,1)时图片填充后的结果, 红色代表内核
图片以结果为例
= 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12
= 5 * 1 + 6 * 1 + 2 * 1 + 3 * 1 = 16
= 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
= 2 * 1 + 3 * 1 + 5 * 1 + 6 * 1 = 16
= 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
= 5 * 1 + 6 * 1 + 8 * 1 + 9 * 1 = 28
锚点位置Point(0, 1)时程序输出
-------------filter2D结果------------------
12 16 16
12 16 16
24 28 28
7. 锚点位置Point(1, -1) = Point(1, 1)
内核的(1, 1)对应图片的(0, 0)
蓝色为内核锚点为(1,-1)时图片填充后的结果, 红色代表内核
图片以结果为例
= 5 * 1 + 4 * 1 + 2 * 1 + 1 * 1 = 12
= 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12
= 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
= 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
= 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
= 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
锚点位置Point(1, -1)时程序输出
-------------filter2D结果------------------
12 12 16
12 12 16
24 24 28
8. 锚点位置Point(1, 0)
内核的(1, 0)对应图片的(0, 0)
蓝色为内核锚点为(1,0)时图片填充后的结果, 红色代表内核
图片以结果为例
= 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
= 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
= 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
= 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
= 8 * 1 + 7* 1 + 5 * 1 + 4 * 1 = 24
= 7 * 1 + 8 * 1 + 4 * 1 + 5 * 1 = 24
锚点位置Point(1, 0)时程序输出
-------------filter2D结果------------------
12 12 16
24 24 28
24 24 28
9. 锚点位置Point(1, 1)
内核的(1, 1)对应图片的(0, 0)
蓝色为内核锚点为(1, 1)时图片填充后的结果, 红色代表内核
图片以结果为例
= 5 * 1 + 4 * 1 + 2 * 1 + 1 * 1 = 12
= 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12
= 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
= 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
= 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
= 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
锚点位置Point(1, 1)时程序输出
-------------filter2D结果------------------
12 12 16
12 12 16
24 24 28