Core之图像基础变换
基础变换操作汇总
一、翻转
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);
结果:
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();
结果:
三、转置
对矩阵进行行列互换。与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();
结果:
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.将一个方阵的下半部分或上半部分复制到其另一半。矩阵的对角线保持不变。
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);
结果:
五、缩放
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);
}
结果:
六、加边框
在图像的边界周围添加边框
1.字段
只列举了部分
2.方法介绍
该函数将源图像复制到目标图像的中间。复制的源图像左侧、右侧、上方和下方的区域将用外推像素填充
Mat src = Imgcodecs.imread("flip.jpg");
//频域图像
Mat dst = new Mat();
Core.copyMakeBorder(src,dst,100,100,100,100,Core.BORDER_REPLICATE);
结果:
请尝试其它类型查看效果