OpenCV中的anchor的Point(-1,-1)解析

说明

  1. 使用OpenCV的filter2D函数观察内核锚点处于不同位置时的运算结果。填充方式使用BORDER_DEFAULT
    边界填充说明
    filter2D函数说明
  2. 默认值为(-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)时图片填充后的结果, 红色代表内核
图片以 d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0)结果为例
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190921100740817.png
d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0) = 5 * 1 + 4 * 1 + 2 * 1 + 1 * 1 = 12
d s t ( r o w = 0 , c o l = 1 ) dst_{(row = 0, col = 1)} dst(row=0,col=1) = 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12
d s t ( r o w = 0 , c o l = 2 ) dst_{(row = 0, col = 2)} dst(row=0,col=2) = 5 * 1 + 6 * 1 + 2 * 1 + 3 * 1 = 16

d s t ( r o w = 1 , c o l = 0 ) dst_{(row = 1, col = 0)} dst(row=1,col=0) = 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
d s t ( r o w = 1 , c o l = 1 ) dst_{(row = 1, col = 1)} dst(row=1,col=1) = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
d s t ( r o w = 1 , c o l = 2 ) dst_{(row = 1, col = 2)} dst(row=1,col=2) = 2 * 1 + 3 * 1 + 5 * 1 + 6 * 1 = 12

d s t ( r o w = 2 , c o l = 0 ) dst_{(row = 2, col = 0)} dst(row=2,col=0) = 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
d s t ( r o w = 2 , c o l = 1 ) dst_{(row = 2, col = 1)} dst(row=2,col=1) = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
d s t ( r o w = 2 , c o l = 2 ) dst_{(row = 2, col = 2)} dst(row=2,col=2) = 5 * 1 + 6 * 1 + 8 * 1 + 9 * 1 = 28

锚点位置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)时图片填充后的结果, 红色代表内核
图片以 d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0)结果为例
在这里插入图片描述
d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0) = 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
d s t ( r o w = 0 , c o l = 1 ) dst_{(row = 0, col = 1)} dst(row=0,col=1) = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
d s t ( r o w = 0 , c o l = 2 ) dst_{(row = 0, col = 2)} dst(row=0,col=2) = 2 * 1 + 3 * 1 + 5 * 1 + 6 * 1 = 16

d s t ( r o w = 1 , c o l = 0 ) dst_{(row = 1, col = 0)} dst(row=1,col=0) = 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
d s t ( r o w = 1 , c o l = 1 ) dst_{(row = 1, col = 1)} dst(row=1,col=1) = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
d s t ( r o w = 1 , c o l = 2 ) dst_{(row = 1, col = 2)} dst(row=1,col=2) = 5 * 1 + 6 * 1 + 8 * 1 + 9 * 1 = 28

d s t ( r o w = 2 , c o l = 0 ) dst_{(row = 2, col = 0)} dst(row=2,col=0) = 8 * 1 + 7* 1 + 5 * 1 + 4 * 1 = 24
d s t ( r o w = 2 , c o l = 1 ) dst_{(row = 2, col = 1)} dst(row=2,col=1) = 7 * 1 + 8 * 1 + 4 * 1 + 5 * 1 = 24
d s t ( r o w = 2 , c o l = 2 ) dst_{(row = 2, col = 2)} dst(row=2,col=2) = 8 * 1 + 9 * 1 + 5 * 1 + 6 * 1 = 28

锚点位置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)时图片填充后的结果, 红色代表内核
图片以 d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0)结果为例
在这里插入图片描述
d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0) = 5 * 1 + 4 * 1 + 2 * 1 + 1 * 1 = 12
d s t ( r o w = 0 , c o l = 1 ) dst_{(row = 0, col = 1)} dst(row=0,col=1) = 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12
d s t ( r o w = 0 , c o l = 2 ) dst_{(row = 0, col = 2)} dst(row=0,col=2) = 5 * 1 + 6 * 1 + 2 * 1 + 3 * 1 = 16

d s t ( r o w = 1 , c o l = 0 ) dst_{(row = 1, col = 0)} dst(row=1,col=0) = 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
d s t ( r o w = 1 , c o l = 1 ) dst_{(row = 1, col = 1)} dst(row=1,col=1) = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
d s t ( r o w = 1 , c o l = 2 ) dst_{(row = 1, col = 2)} dst(row=1,col=2) = 2 * 1 + 3 * 1 + 5 * 1 + 6 * 1 = 12

d s t ( r o w = 2 , c o l = 0 ) dst_{(row = 2, col = 0)} dst(row=2,col=0) = 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
d s t ( r o w = 2 , c o l = 1 ) dst_{(row = 2, col = 1)} dst(row=2,col=1) = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
d s t ( r o w = 2 , c o l = 2 ) dst_{(row = 2, col = 2)} dst(row=2,col=2) = 5 * 1 + 6 * 1 + 8 * 1 + 9 * 1 = 28

锚点位置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)时图片填充后的结果, 红色代表内核
图片以 d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0)结果为例
在这里插入图片描述
d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0) = 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12
d s t ( r o w = 0 , c o l = 1 ) dst_{(row = 0, col = 1)} dst(row=0,col=1) = 5 * 1 + 6 * 1 + 2 * 1 + 3 * 1 = 16
d s t ( r o w = 0 , c o l = 2 ) dst_{(row = 0, col = 2)} dst(row=0,col=2) = 6 * 1 + 5 * 1 + 3 * 1 + 2 * 1 = 16

d s t ( r o w = 1 , c o l = 0 ) dst_{(row = 1, col = 0)} dst(row=1,col=0) = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
d s t ( r o w = 1 , c o l = 1 ) dst_{(row = 1, col = 1)} dst(row=1,col=1) = 2 * 1 + 3 * 1 + 5 * 1 + 6 * 1 = 16
d s t ( r o w = 1 , c o l = 2 ) dst_{(row = 1, col = 2)} dst(row=1,col=2) = 3 * 1 + 2 * 1 + 6 * 1 + 5 * 1 = 16

d s t ( r o w = 2 , c o l = 0 ) dst_{(row = 2, col = 0)} dst(row=2,col=0) = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
d s t ( r o w = 2 , c o l = 1 ) dst_{(row = 2, col = 1)} dst(row=2,col=1) = 5 * 1 + 6 * 1 + 8 * 1 + 9 * 1 = 28
d s t ( r o w = 2 , c o l = 2 ) dst_{(row = 2, col = 2)} dst(row=2,col=2) = 6 * 1 + 5 * 1 + 9 * 1 + 8 * 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)时图片填充后的结果, 红色代表内核
图片以 d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0)结果为例
在这里插入图片描述
d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0) = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
d s t ( r o w = 0 , c o l = 1 ) dst_{(row = 0, col = 1)} dst(row=0,col=1) = 2 * 1 + 3 * 1 + 5 * 1 + 6 * 1 = 16
d s t ( r o w = 0 , c o l = 2 ) dst_{(row = 0, col = 2)} dst(row=0,col=2) = 3 * 1 + 2 * 1 + 6 * 1 + 5 * 1 = 16

d s t ( r o w = 1 , c o l = 0 ) dst_{(row = 1, col = 0)} dst(row=1,col=0) = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
d s t ( r o w = 1 , c o l = 1 ) dst_{(row = 1, col = 1)} dst(row=1,col=1) = 5 * 1 + 6 * 1 + 8 * 1 + 9 * 1 = 28
d s t ( r o w = 1 , c o l = 2 ) dst_{(row = 1, col = 2)} dst(row=1,col=2) = 6 * 1 + 5 * 1 + 9 * 1 + 8 * 1 = 28

d s t ( r o w = 2 , c o l = 0 ) dst_{(row = 2, col = 0)} dst(row=2,col=0) = 7 * 1 + 8 * 1 + 4 * 1 + 5 * 1 = 24
d s t ( r o w = 2 , c o l = 1 ) dst_{(row = 2, col = 1)} dst(row=2,col=1) = 8 * 1 + 9 * 1 + 5 * 1 + 6 * 1 = 28
d s t ( r o w = 2 , c o l = 2 ) dst_{(row = 2, col = 2)} dst(row=2,col=2) = 9 * 1 + 8 * 1 + 6 * 1 + 5 * 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)时图片填充后的结果, 红色代表内核
图片以 d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0)结果为例
在这里插入图片描述
d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0) = 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12
d s t ( r o w = 0 , c o l = 1 ) dst_{(row = 0, col = 1)} dst(row=0,col=1) = 5 * 1 + 6 * 1 + 2 * 1 + 3 * 1 = 16
d s t ( r o w = 0 , c o l = 2 ) dst_{(row = 0, col = 2)} dst(row=0,col=2) = 6 * 1 + 5 * 1 + 3 * 1 + 2 * 1 = 16

d s t ( r o w = 1 , c o l = 0 ) dst_{(row = 1, col = 0)} dst(row=1,col=0) = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
d s t ( r o w = 1 , c o l = 1 ) dst_{(row = 1, col = 1)} dst(row=1,col=1) = 2 * 1 + 3 * 1 + 5 * 1 + 6 * 1 = 16
d s t ( r o w = 1 , c o l = 2 ) dst_{(row = 1, col = 2)} dst(row=1,col=2) = 3 * 1 + 2 * 1 + 6 * 1 + 5 * 1 = 16

d s t ( r o w = 2 , c o l = 0 ) dst_{(row = 2, col = 0)} dst(row=2,col=0) = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
d s t ( r o w = 2 , c o l = 1 ) dst_{(row = 2, col = 1)} dst(row=2,col=1) = 5 * 1 + 6 * 1 + 8 * 1 + 9 * 1 = 28
d s t ( r o w = 2 , c o l = 2 ) dst_{(row = 2, col = 2)} dst(row=2,col=2) = 6 * 1 + 5 * 1 + 9 * 1 + 8 * 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)时图片填充后的结果, 红色代表内核
图片以 d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0)结果为例
在这里插入图片描述
d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0) = 5 * 1 + 4 * 1 + 2 * 1 + 1 * 1 = 12
d s t ( r o w = 0 , c o l = 1 ) dst_{(row = 0, col = 1)} dst(row=0,col=1) = 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12
d s t ( r o w = 0 , c o l = 2 ) dst_{(row = 0, col = 2)} dst(row=0,col=2) = 5 * 1 + 6 * 1 + 2 * 1 + 3 * 1 = 16

d s t ( r o w = 1 , c o l = 0 ) dst_{(row = 1, col = 0)} dst(row=1,col=0) = 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
d s t ( r o w = 1 , c o l = 1 ) dst_{(row = 1, col = 1)} dst(row=1,col=1) = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
d s t ( r o w = 1 , c o l = 2 ) dst_{(row = 1, col = 2)} dst(row=1,col=2) = 2 * 1 + 3 * 1 + 5 * 1 + 6 * 1 = 12

d s t ( r o w = 2 , c o l = 0 ) dst_{(row = 2, col = 0)} dst(row=2,col=0) = 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
d s t ( r o w = 2 , c o l = 1 ) dst_{(row = 2, col = 1)} dst(row=2,col=1) = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
d s t ( r o w = 2 , c o l = 2 ) dst_{(row = 2, col = 2)} dst(row=2,col=2) = 5 * 1 + 6 * 1 + 8 * 1 + 9 * 1 = 28

锚点位置Point(1, -1)时程序输出
-------------filter2D结果------------------
12 12 16
12 12 16
24 24 28

8. 锚点位置Point(1, 0)

内核的(1, 0)对应图片的(0, 0)
蓝色为内核锚点为(1,0)时图片填充后的结果, 红色代表内核
图片以 d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0)结果为例
在这里插入图片描述
d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0) = 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
d s t ( r o w = 0 , c o l = 1 ) dst_{(row = 0, col = 1)} dst(row=0,col=1) = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
d s t ( r o w = 0 , c o l = 2 ) dst_{(row = 0, col = 2)} dst(row=0,col=2) = 2 * 1 + 3 * 1 + 5 * 1 + 6 * 1 = 16

d s t ( r o w = 1 , c o l = 0 ) dst_{(row = 1, col = 0)} dst(row=1,col=0) = 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
d s t ( r o w = 1 , c o l = 1 ) dst_{(row = 1, col = 1)} dst(row=1,col=1) = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
d s t ( r o w = 1 , c o l = 2 ) dst_{(row = 1, col = 2)} dst(row=1,col=2) = 5 * 1 + 6 * 1 + 8 * 1 + 9 * 1 = 28

d s t ( r o w = 2 , c o l = 0 ) dst_{(row = 2, col = 0)} dst(row=2,col=0) = 8 * 1 + 7* 1 + 5 * 1 + 4 * 1 = 24
d s t ( r o w = 2 , c o l = 1 ) dst_{(row = 2, col = 1)} dst(row=2,col=1) = 7 * 1 + 8 * 1 + 4 * 1 + 5 * 1 = 24
d s t ( r o w = 2 , c o l = 2 ) dst_{(row = 2, col = 2)} dst(row=2,col=2) = 8 * 1 + 9 * 1 + 5 * 1 + 6 * 1 = 28

锚点位置Point(1, 0)时程序输出
-------------filter2D结果------------------
12 12 16
24 24 28
24 24 28

9. 锚点位置Point(1, 1)

内核的(1, 1)对应图片的(0, 0)
蓝色为内核锚点为(1, 1)时图片填充后的结果, 红色代表内核
图片以 d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0)结果为例
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190921100740817.png
d s t ( r o w = 0 , c o l = 0 ) dst_{(row = 0, col = 0)} dst(row=0,col=0) = 5 * 1 + 4 * 1 + 2 * 1 + 1 * 1 = 12
d s t ( r o w = 0 , c o l = 1 ) dst_{(row = 0, col = 1)} dst(row=0,col=1) = 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12
d s t ( r o w = 0 , c o l = 2 ) dst_{(row = 0, col = 2)} dst(row=0,col=2) = 5 * 1 + 6 * 1 + 2 * 1 + 3 * 1 = 16

d s t ( r o w = 1 , c o l = 0 ) dst_{(row = 1, col = 0)} dst(row=1,col=0) = 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
d s t ( r o w = 1 , c o l = 1 ) dst_{(row = 1, col = 1)} dst(row=1,col=1) = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
d s t ( r o w = 1 , c o l = 2 ) dst_{(row = 1, col = 2)} dst(row=1,col=2) = 2 * 1 + 3 * 1 + 5 * 1 + 6 * 1 = 12

d s t ( r o w = 2 , c o l = 0 ) dst_{(row = 2, col = 0)} dst(row=2,col=0) = 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
d s t ( r o w = 2 , c o l = 1 ) dst_{(row = 2, col = 1)} dst(row=2,col=1) = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
d s t ( r o w = 2 , c o l = 2 ) dst_{(row = 2, col = 2)} dst(row=2,col=2) = 5 * 1 + 6 * 1 + 8 * 1 + 9 * 1 = 28

锚点位置Point(1, 1)时程序输出
-------------filter2D结果------------------
12 12 16
12 12 16
24 24 28

参考链接

https://blog.csdn.net/liquan1434/article/details/22314171
https://blog.csdn.net/u011028771/article/details/80160428

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值