java+opencv 实现数字图像处理的几何变换和傅里叶变换

Java+OpenCV实现数字图像的相关处理

前言

数字图像处理课程的一些知识,OpenCV主要还是用C++,用java的资料较少,所以就将自己的一些代码分享出来,不足之处,请指正。

几何变换

几何变换是数字图像处理中最基本的操作,包括平移,旋转,缩放等,具体公式可自行了解,直接上代码和图片了。

//旋转
public Mat rotate(Mat src,double angle) {   
		Point center = new Point(src.cols()/2,src.rows()/2);
        //double angle=60;//旋转角度
    	double scale=1;//缩放尺度
    	Mat mat = Imgproc.getRotationMatrix2D(center, angle, scale);
    	Imgproc.warpAffine(src, mat, mat, src.size());
    	return mat;
	}

旋转结果
旋转结果

//平移
public Mat move(Mat src,double x,double y) { 
		Mat mat = new Mat(2,3,CvType.CV_32FC1);
		mat.put(0,0,new double[]{1,0,x,0,1,y});
		Mat m = src;
		Imgproc.warpAffine(src,mat,mat,src.size());
		return mat;
	}

平移结果
平移

//缩放
public Mat scale(Mat src,double scale) {  
		Point center = new Point(src.cols()/2,src.rows()/2);
        double angle=0;//旋转角度
    	//double scale=0.6;//缩放尺度
    	Mat mat = Imgproc.getRotationMatrix2D(center, angle, scale);
    	Imgproc.warpAffine(src, mat, mat, src.size());
    	return mat;
	}

缩放结果
缩放结果

傅里叶变换

通过改写c++代码得到的傅里叶变换函数

//傅里叶变换
public Mat fourier(Mat src) {  
		int new_height = Core.getOptimalDFTSize(src.rows()); // 获取纵向扩充后的距离(高度)
        int new_width = Core.getOptimalDFTSize(src.cols()); // 获取横向扩充后的距离(宽度)
        Mat padded = new Mat();
        // 扩充图像边界
        Core.copyMakeBorder(src,padded, 0,new_height - src.rows(), 0, new_width - src.cols() , Core.BORDER_CONSTANT , Scalar.all(0));
               
        List<Mat> paddedMat_channels = new ArrayList<Mat>();
       
        //转float
        padded.convertTo(padded,CvType.CV_32F);
        paddedMat_channels.add(padded);
        paddedMat_channels.add(Mat.zeros(padded.size(),CvType.CV_32F));

        //合并通道
        Mat complexImage = new Mat();
        Core.merge(paddedMat_channels,complexImage);
        //离散傅里叶变换
        Core.dft(complexImage,complexImage);
        //分割通道
        Core.split(complexImage,paddedMat_channels);

        //将复数值转化为副值        
        Mat temp = new Mat();
        Core.magnitude(paddedMat_channels.get(0),paddedMat_channels.get(1),temp);
        Core.add(temp,Scalar.all(0),temp);
        Core.log(temp, temp);        
        temp = new Mat(temp,new Rect(0,0,temp.cols()&-2,temp.rows()&-2));
        
        int cx = src.cols() / 2;
        int cy = src.rows() / 2;

        Mat q0 = new Mat(temp, new Rect(0, 0, cx, cy));
        Mat q1 = new Mat(temp, new Rect(cx, 0, cx, cy));
        Mat q2 = new Mat(temp, new Rect(0, cy, cx, cy));
        Mat q3 = new Mat(temp, new Rect(cx, cy, cx, cy));

        Mat tmp = new Mat();
        q0.copyTo(tmp);
        q3.copyTo(q0);
        tmp.copyTo(q3);
        q1.copyTo(tmp);
        q2.copyTo(q1);
        tmp.copyTo(q2);
        
        Core.normalize(temp, temp, 0, 255, Core.NORM_MINMAX);
              
        Imgcodecs.imwrite(".\\src\\photo\\test.jpg", temp);  //图片保存到本地
        Mat mat = Imgcodecs.imread(".\\src\\photo\\test.jpg");   //图片读取      
        
        return mat;
	}

傅里叶变换结果
傅里叶变换结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值