前言
数字图像处理课程的一些知识,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;
}
傅里叶变换结果