基础变换操作汇总

一、翻转

1.flip

   围绕垂直、水平或两个轴翻转2D数组

        Mat src = Imgcodecs.imread("flip.jpg");
        // 创建一个与原始图像相同大小和类型的目标图像
        Mat dst = new Mat(src.rows(), src.cols(), src.type());
        // 进行水平翻转
        Core.flip(src, dst, 1);
        // 保存翻转后的图像
        Imgcodecs.imwrite("res_flip.jpg", dst);

结果:
16.java openCV4.x 入门-Core之图像翻转、旋转、加边框-LMLPHP

2.flipND

   在给定的轴上翻转n维数组。下方参数的解释仅对二维矩阵进行说明

        Mat mat = new Mat(3, 3, CvType.CV_8UC1);
        mat.put(0,0,1,2,3,4,5,6,7,8,9);
        Mat dst = new Mat();
        Core.flipND(mat,dst,-1);

请自行验证结果

二、旋转

   以90度的倍数旋转矩阵.(中心旋转)

1.字段

2.rotate​

        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat imread = Imgcodecs.imread("flip.jpg");
        Mat dst = new Mat();
        Core.rotate(imread,dst,Core.ROTATE_180);
        HighGui.imshow("imread",imread);
        HighGui.imshow("dst",dst);
        HighGui.waitKey();

结果:
16.java openCV4.x 入门-Core之图像翻转、旋转、加边框-LMLPHP

三、转置

   对矩阵进行行列互换。与Mat.t()方法作用一样。

1.transpose

        Mat imread = Imgcodecs.imread("flip.jpg");
        Mat dst = new Mat();
        Core.transpose(imread,dst);
        HighGui.imshow("imread",imread);
        HighGui.imshow("dst",dst);
        HighGui.waitKey();

结果:
16.java openCV4.x 入门-Core之图像翻转、旋转、加边框-LMLPHP

2.transposeND

   适用于 n 维矩阵的转置.。下方参数的解释仅对二维矩阵进行说明.了解即可
注意: 输入应为连续的单通道矩阵

        Mat mat = new Mat(3, 3, CvType.CV_8UC1);
        mat.put(0,0,1,2,3,4,5,6,7,8,9 );
        Mat dst = new Mat();

        MatOfInt matOfInt  = new MatOfInt();
        //y轴和x轴互换
        matOfInt.fromArray(1,0);
        Core.transposeND(mat,matOfInt,dst);

四、复制

1.completeSymm

1.将一个方阵的下半部分或上半部分复制到其另一半。矩阵的对角线保持不变。
16.java openCV4.x 入门-Core之图像翻转、旋转、加边框-LMLPHP

        Mat mat = new Mat(3, 3, CvType.CV_8UC1);
        mat.put(0,0,1,2,3,4,5,6,7,8,9 );
        Core.completeSymm(mat,true);

请自行验证

2.repeat(重复复制)

   每个轴上重复输入数组一次或多次。

        Mat imread = Imgcodecs.imread("flip.jpg");
        Mat dst = new Mat();
        Core.repeat(imread,2,2,dst);

结果:
16.java openCV4.x 入门-Core之图像翻转、旋转、加边框-LMLPHP

五、缩放

1.convertScaleAbs

  缩放、计算绝对值,并将结果转换为8位

        Mat src = Mat.eye(3, 3, CvType.CV_32F);
        src.put(0,0,1,2,3,4,5,6,7,8,9);
        System.out.println("src.dump() = \n" + src.dump());
        // 创建输出矩阵
        Mat dst = new Mat();
        // 设置缩放因子和偏移量
        double alpha = 2.0;
        double beta = 1.0;
        // 调用convertScaleAbs方法进行缩放、取绝对值和转换
        Core.convertScaleAbs(src, dst, alpha, beta);
        System.out.println("dst.dump() = \n" + dst.dump());

请自行验证结果
   通过结果,可以看出我们可以用这个函数改变图像的亮度。

窗口示例:

    public static void main(String[] args) {
        // 加载OpenCV库
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat imread = Imgcodecs.imread("flip.jpg");
        JFrame frame = HighGui.createJFrame("img", HighGui.WINDOW_NORMAL);

        JPanel jPanel = new JPanel();
        jPanel.setLayout(new BoxLayout(jPanel,BoxLayout.Y_AXIS));
        JSlider slider   = new JSlider(0,10,1);
        slider.setPaintTicks(true);
        slider.setPaintLabels(true);
        slider.setMajorTickSpacing(10);
        slider.setMinorTickSpacing(1);

        JSlider slider2   = new JSlider(0,100,10);
        slider2.setPaintTicks(true);
        slider2.setPaintLabels(true);
        slider2.setMajorTickSpacing(10);
        slider2.setMinorTickSpacing(1);

        jPanel.add(slider);
        jPanel.add(slider2);
        // 创建输出矩阵
        Mat dst = new Mat();

        frame.add(jPanel,BorderLayout.NORTH);

        JLabel jLabel = new JLabel();
        Image image = HighGui.toBufferedImage(imread);
        jLabel.setIcon(new ImageIcon(image));

        frame.add(jLabel,BorderLayout.CENTER);

        final int[] alpha = {1};
        final int[] beta = {0};

        slider.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                JSlider source = (JSlider) e.getSource();
                alpha[0] =source.getValue();
                Core.convertScaleAbs(imread, dst, alpha[0], beta[0]);
                Image image1 = HighGui.toBufferedImage(dst);
                jLabel.setIcon(new ImageIcon(image1));
                frame.repaint();
            }
        });

        slider2.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                JSlider source = (JSlider) e.getSource();
                beta[0] = source.getValue();
                System.out.println("beta[0] = " + beta[0]);
                Core.convertScaleAbs(imread, dst, alpha[0], beta[0]);
                Image image1 = HighGui.toBufferedImage(dst);
                jLabel.setIcon(new ImageIcon(image1));
                frame.repaint();
            }
        });
        frame.pack();
        frame.setVisible(true);
    }

结果:
16.java openCV4.x 入门-Core之图像翻转、旋转、加边框-LMLPHP

六、加边框

   在图像的边界周围添加边框

1.字段

  只列举了部分

2.方法介绍

   该函数将源图像复制到目标图像的中间。复制的源图像左侧、右侧、上方和下方的区域将用外推像素填充

        Mat src = Imgcodecs.imread("flip.jpg");
        //频域图像
        Mat dst = new Mat();
        Core.copyMakeBorder(src,dst,100,100,100,100,Core.BORDER_REPLICATE);

结果:
16.java openCV4.x 入门-Core之图像翻转、旋转、加边框-LMLPHP
请尝试其它类型查看效果

04-12 17:11