版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
package com.zxj.opencv.demo;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class ImageProcess {
private static final String DIR = "d:/opencv/";
private static final String TEST_IMG = "d:/11.jpg";
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);// 加载opencv c++动态库
flip();
erode();
dilate();
morphologyEx();
blur();
boxFilter();
GaussianBlur();
medianBlur();
bilateralFilter();
pyrUp();
pyrDown();
resize();
warpAffine();
}
/******** 1.2.1 *******/
public static void flip() {// 翻转
Mat src = Imgcodecs.imread(TEST_IMG, Imgcodecs.IMREAD_COLOR);
Mat dst = new Mat();
// Core.flip(src, dst, 0);//x翻转
Core.flip(src, dst, 1);// y翻转
// Core.flip(src, dst, -1);//x y軕同时翻转
Imgcodecs.imwrite(DIR + "flip.jpg", dst);// 写入文件
}
/******** 1.2.2 *******/
public static void erode() {// 腐蚀
Mat src = Imgcodecs.imread(TEST_IMG, Imgcodecs.IMREAD_COLOR);
Mat dst = new Mat();
// 核的中心坐标-1,-1, 迭代次数2,图形边界处理方法,边界值
Imgproc.erode(src, dst, new Mat(), new Point(-1, -1), 2, Core.BORDER_CONSTANT, Scalar.all(-Double.MAX_VALUE));
Imgcodecs.imwrite(DIR + "erode.jpg", dst);// 写入文件
}
public static void dilate() {// 膨胀
Mat src = Imgcodecs.imread(TEST_IMG, Imgcodecs.IMREAD_COLOR);
Mat dst = new Mat();
// 核的中心坐标-1,-1, 迭代次数2,图形边界处理方法,边界值
Imgproc.dilate(src, dst, new Mat(), new Point(-1, -1), 2, Core.BORDER_CONSTANT, Scalar.all(-Double.MAX_VALUE));
Imgcodecs.imwrite(DIR + "dilate.jpg", dst);// 写入文件
}
public static void morphologyEx() {// morphologyEx计算
Mat src = Imgcodecs.imread(TEST_IMG, Imgcodecs.IMREAD_COLOR);
Mat dst = new Mat();
// MORPH_OPEN 开运算
Imgproc.morphologyEx(src, dst, Imgproc.MORPH_BLACKHAT, new Mat(), new Point(-1, -1), 2, Core.BORDER_CONSTANT,
Scalar.all(-Double.MAX_VALUE));
Imgcodecs.imwrite(DIR + "MORPH_OPEN.jpg", dst);// 写入文件
}
/******** 1.2.3 *******/
public static void blur() {// 均值滤波
Mat src = Imgcodecs.imread(TEST_IMG, Imgcodecs.IMREAD_COLOR);
Mat dst = new Mat();
// 滤波核大小3X3m周围9点的均值 ,BORDER_DEFAULT
Imgproc.blur(src, dst, new Size(3, 3), new Point(-1, -1), Core.BORDER_DEFAULT);
Imgcodecs.imwrite(DIR + "blur.jpg", dst);// 写入文件
}
public static void boxFilter() {// 方框滤波
Mat src = Imgcodecs.imread(TEST_IMG, Imgcodecs.IMREAD_COLOR);
Mat dst = new Mat();
// 深度-1表示与原因同样的深度,false不进行归一化处理
Imgproc.boxFilter(src, dst, -1, new Size(3, 3), new Point(-1, -1), false, Core.BORDER_DEFAULT);
Imgcodecs.imwrite(DIR + "boxFilter.jpg", dst);// 写入文件
}
public static void GaussianBlur() {// 高斯滤波
Mat src = Imgcodecs.imread(TEST_IMG, Imgcodecs.IMREAD_COLOR);
Mat dst = new Mat();
// 正奇数核大小(3*5),x和y偏差值都为5
Imgproc.GaussianBlur(src, dst, new Size(3, 5), 5, 5, Core.BORDER_DEFAULT);
// Mat kernel=Imgproc.getGaussianKernel(5, 2,CvType.CV_32F);
Imgcodecs.imwrite(DIR + "GaussianBlur.jpg", dst);// 写入文件
}
public static void medianBlur() {// 中值滤波
Mat src = Imgcodecs.imread(TEST_IMG, Imgcodecs.IMREAD_COLOR);
Mat dst = new Mat();
Imgproc.medianBlur(src, dst, 7);// 大于1的奇数值,这里设为7
Imgcodecs.imwrite(DIR + "medianBlur.jpg", dst);// 写入文件
}
public static void bilateralFilter() {// 双边滤波
Mat src = Imgcodecs.imread(TEST_IMG, Imgcodecs.IMREAD_COLOR);
Mat dst = new Mat();
Imgproc.bilateralFilter(src, dst, 5, 300, 200, Core.BORDER_DEFAULT);// 大于1的奇数值,这里设为7
Imgcodecs.imwrite(DIR + "bilateralFilter.jpg", dst);// 写入文件
}
/******** 1.2.4缩放 *******/
public static void pyrUp() {// 放大
Mat src = Imgcodecs.imread(TEST_IMG, Imgcodecs.IMREAD_COLOR);
Mat dst = new Mat();
Imgproc.pyrUp(src, dst, new Size(src.cols() * 2, src.rows() * 2), Core.BORDER_DEFAULT);
Imgcodecs.imwrite(DIR + "pyrUp.jpg", dst);// 写入文件
}
public static void pyrDown() {// 缩小
Mat src = Imgcodecs.imread(TEST_IMG, Imgcodecs.IMREAD_COLOR);
Mat dst = new Mat();
Imgproc.pyrDown(src, dst, new Size((src.cols() + 1) / 2, (src.rows() + 1) / 2), Core.BORDER_DEFAULT);
Imgcodecs.imwrite(DIR + "pyrDown.jpg", dst);// 写入文件
}
public static void resize() {// 缩放
Mat src = Imgcodecs.imread(TEST_IMG, Imgcodecs.IMREAD_COLOR);
Mat dst = new Mat();
// Imgproc.resize(src, dst, new Size(500,600), 0.5,0.5,Imgproc.INTER_NEAREST);//500X600 按最临近值插值
Imgproc.resize(src, dst, new Size(500, 600), 0.5, 0.5, Imgproc.INTER_LINEAR);// 500X600
// 按双线性插值,比INTER_NEAREST效果要好
Imgcodecs.imwrite(DIR + "INTER_NEAREST.jpg", dst);// 写入文件
}
/******** 1.2.5旋转 *******/
public static void warpAffine() {// 缩放
Mat src = Imgcodecs.imread(TEST_IMG, Imgcodecs.IMREAD_COLOR);
Mat dst = new Mat();
Point center=new Point(src.cols()/2,src.rows()/2);//原图中心点
double angle=50;//旋转角度
double scale=1;//缩放比例
Mat rot_mat=Imgproc.getRotationMatrix2D(center, angle, scale);
Imgproc.warpAffine(src, dst, rot_mat, src.size(), Imgproc.INTER_LINEAR, Core.BORDER_DEFAULT,Scalar.all(0));//
Imgcodecs.imwrite(DIR + "warpAffine.jpg", dst);// 写入文件
}
}