文章目录

  • 说明
  • 内核
  • 图片
  • 锚点分析
  • 测试代码
  • 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)
  • 参考链接


说明

  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内核

opencv输出线段的中点线_System

图片

opencv输出线段的中点线_锚点_02


为方便说明,我们事先进行边界填充,填充该条件下到最全的状态,即满足内核不同位置时填充出的图片皆为此图的子集

opencv输出线段的中点线_System_03

锚点分析

测试代码
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)时图片填充后的结果, 红色代表内核

图片以opencv输出线段的中点线_opencv输出线段的中点线_04结果为例

opencv输出线段的中点线_锚点_05


opencv输出线段的中点线_opencv输出线段的中点线_04 = 5 * 1 + 4 * 1 + 2 * 1 + 1 * 1 = 12

opencv输出线段的中点线_System_07 = 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12

opencv输出线段的中点线_锚点_08

opencv输出线段的中点线_ide_09 = 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
opencv输出线段的中点线_锚点_10 = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
opencv输出线段的中点线_ide_11

opencv输出线段的中点线_opencv输出线段的中点线_12 = 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
opencv输出线段的中点线_锚点_13 = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
opencv输出线段的中点线_锚点_14

锚点位置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)时图片填充后的结果, 红色代表内核

图片以opencv输出线段的中点线_opencv输出线段的中点线_04结果为例

opencv输出线段的中点线_锚点_16


opencv输出线段的中点线_opencv输出线段的中点线_04 = 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12

opencv输出线段的中点线_System_07 = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12

opencv输出线段的中点线_锚点_08

opencv输出线段的中点线_ide_09 = 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
opencv输出线段的中点线_锚点_10 = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
opencv输出线段的中点线_ide_11

opencv输出线段的中点线_opencv输出线段的中点线_12 = 8 * 1 + 7* 1 + 5 * 1 + 4 * 1 = 24
opencv输出线段的中点线_锚点_13 = 7 * 1 + 8 * 1 + 4 * 1 + 5 * 1 = 24
opencv输出线段的中点线_锚点_14

锚点位置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)时图片填充后的结果, 红色代表内核

图片以opencv输出线段的中点线_opencv输出线段的中点线_04结果为例

opencv输出线段的中点线_锚点_27


opencv输出线段的中点线_opencv输出线段的中点线_04 = 5 * 1 + 4 * 1 + 2 * 1 + 1 * 1 = 12

opencv输出线段的中点线_System_07 = 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12

opencv输出线段的中点线_锚点_08

opencv输出线段的中点线_ide_09 = 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
opencv输出线段的中点线_锚点_10 = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
opencv输出线段的中点线_ide_11

opencv输出线段的中点线_opencv输出线段的中点线_12 = 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
opencv输出线段的中点线_锚点_13 = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
opencv输出线段的中点线_锚点_14

锚点位置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)时图片填充后的结果, 红色代表内核

图片以opencv输出线段的中点线_opencv输出线段的中点线_04结果为例

opencv输出线段的中点线_锚点_38


opencv输出线段的中点线_opencv输出线段的中点线_04 = 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12

opencv输出线段的中点线_System_07 = 5 * 1 + 6 * 1 + 2 * 1 + 3 * 1 = 16

opencv输出线段的中点线_锚点_08

opencv输出线段的中点线_ide_09 = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
opencv输出线段的中点线_锚点_10 = 2 * 1 + 3 * 1 + 5 * 1 + 6 * 1 = 16
opencv输出线段的中点线_ide_11

opencv输出线段的中点线_opencv输出线段的中点线_12 = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
opencv输出线段的中点线_锚点_13 = 5 * 1 + 6 * 1 + 8 * 1 + 9 * 1 = 28
opencv输出线段的中点线_锚点_14

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

5. 锚点位置Point(0, 0)

内核的(0, 0)对应图片的(0, 0)

蓝色为内核锚点为(0,0)时图片填充后的结果, 红色代表内核

图片以opencv输出线段的中点线_opencv输出线段的中点线_04结果为例

opencv输出线段的中点线_opencv输出线段的中点线_49


opencv输出线段的中点线_opencv输出线段的中点线_04 = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12

opencv输出线段的中点线_System_07 = 2 * 1 + 3 * 1 + 5 * 1 + 6 * 1 = 16

opencv输出线段的中点线_锚点_08

opencv输出线段的中点线_ide_09 = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
opencv输出线段的中点线_锚点_10 = 5 * 1 + 6 * 1 + 8 * 1 + 9 * 1 = 28
opencv输出线段的中点线_ide_11

opencv输出线段的中点线_opencv输出线段的中点线_12 = 7 * 1 + 8 * 1 + 4 * 1 + 5 * 1 = 24
opencv输出线段的中点线_锚点_13 = 8 * 1 + 9 * 1 + 5 * 1 + 6 * 1 = 28
opencv输出线段的中点线_锚点_14

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

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

内核的(0, 1)对应图片的(0, 0)

蓝色为内核锚点为(0,1)时图片填充后的结果, 红色代表内核

图片以opencv输出线段的中点线_opencv输出线段的中点线_04结果为例

opencv输出线段的中点线_锚点_38


opencv输出线段的中点线_opencv输出线段的中点线_04 = 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12

opencv输出线段的中点线_System_07 = 5 * 1 + 6 * 1 + 2 * 1 + 3 * 1 = 16

opencv输出线段的中点线_锚点_08

opencv输出线段的中点线_ide_09 = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
opencv输出线段的中点线_锚点_10 = 2 * 1 + 3 * 1 + 5 * 1 + 6 * 1 = 16
opencv输出线段的中点线_ide_11

opencv输出线段的中点线_opencv输出线段的中点线_12 = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
opencv输出线段的中点线_锚点_13 = 5 * 1 + 6 * 1 + 8 * 1 + 9 * 1 = 28
opencv输出线段的中点线_锚点_14

锚点位置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)时图片填充后的结果, 红色代表内核

图片以opencv输出线段的中点线_opencv输出线段的中点线_04结果为例

opencv输出线段的中点线_锚点_27


opencv输出线段的中点线_opencv输出线段的中点线_04 = 5 * 1 + 4 * 1 + 2 * 1 + 1 * 1 = 12

opencv输出线段的中点线_System_07 = 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12

opencv输出线段的中点线_锚点_08

opencv输出线段的中点线_ide_09 = 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
opencv输出线段的中点线_锚点_10 = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
opencv输出线段的中点线_ide_11

opencv输出线段的中点线_opencv输出线段的中点线_12 = 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
opencv输出线段的中点线_锚点_13 = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
opencv输出线段的中点线_锚点_14

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

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

内核的(1, 0)对应图片的(0, 0)

蓝色为内核锚点为(1,0)时图片填充后的结果, 红色代表内核

图片以opencv输出线段的中点线_opencv输出线段的中点线_04结果为例

opencv输出线段的中点线_锚点_16


opencv输出线段的中点线_opencv输出线段的中点线_04 = 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12

opencv输出线段的中点线_System_07 = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12

opencv输出线段的中点线_锚点_08

opencv输出线段的中点线_ide_09 = 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
opencv输出线段的中点线_锚点_10 = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
opencv输出线段的中点线_ide_11

opencv输出线段的中点线_opencv输出线段的中点线_12 = 8 * 1 + 7* 1 + 5 * 1 + 4 * 1 = 24
opencv输出线段的中点线_锚点_13 = 7 * 1 + 8 * 1 + 4 * 1 + 5 * 1 = 24
opencv输出线段的中点线_锚点_14

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

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

内核的(1, 1)对应图片的(0, 0)

蓝色为内核锚点为(1, 1)时图片填充后的结果, 红色代表内核

图片以opencv输出线段的中点线_opencv输出线段的中点线_04结果为例

opencv输出线段的中点线_锚点_05


opencv输出线段的中点线_opencv输出线段的中点线_04 = 5 * 1 + 4 * 1 + 2 * 1 + 1 * 1 = 12

opencv输出线段的中点线_System_07 = 4 * 1 + 5 * 1 + 1 * 1 + 2 * 1 = 12

opencv输出线段的中点线_锚点_08

opencv输出线段的中点线_ide_09 = 2 * 1 + 1 * 1 + 5 * 1 + 4 * 1 = 12
opencv输出线段的中点线_锚点_10 = 1 * 1 + 2 * 1 + 4 * 1 + 5 * 1 = 12
opencv输出线段的中点线_ide_11

opencv输出线段的中点线_opencv输出线段的中点线_12 = 5 * 1 + 4 * 1 + 8 * 1 + 7 * 1 = 24
opencv输出线段的中点线_锚点_13 = 4 * 1 + 5 * 1 + 7 * 1 + 8 * 1 = 24
opencv输出线段的中点线_锚点_14

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