[OPENCV编程案例详解 ,李立宗]对应章节java 实现(第一章)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/u013195275/article/details/79899956
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);// 写入文件
	}
}

猜你喜欢

转载自blog.csdn.net/u013195275/article/details/79899956