package com.opencv;
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.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class OpenCvMain {
//静态代码块加载动态链接库
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static void main(String[] args) {
/*
* IMREAD_UNCHANGED = -1 :不进行转化,比如保存为了16位的图片,读取出来仍然为16位。
* IMREAD_GRAYSCALE = 0 :进行转化为灰度图,比如保存为了16位的图片,读取出来为8位,类型为CV_8UC1。
* IMREAD_COLOR = 1 :进行转化为三通道图像。
* IMREAD_ANYDEPTH = 2 :如果图像深度为16位则读出为16位,32位则读出为32位,其余的转化为8位。
* IMREAD_ANYCOLOR = 4 :图像以任何可能的颜色格式读取
* IMREAD_LOAD_GDAL = 8 :使用GDAL驱动读取文件,GDAL(Geospatial Data Abstraction
* Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。
* 它还有一系列命令行工具来进行数据转换和处理。
*/
Mat src = Imgcodecs.imread("D:\\1234.jpg");
Imgproc.resize(src, src, new Size(src.cols()/2,src.rows()/2));
HighGui.imshow("原图", src);
HighGui.waitKey();
int type = 0;
Mat dst=new Mat();
Mat xmat = new Mat(src.size (),CvType.CV_32FC1);//8位单通道灰度图片
Mat ymat = new Mat(src.size (),CvType.CV_32FC1);//8位单通道灰度图片
for (int i = 0, rlen = src.rows(); i < rlen; i++) {
for (int j = 0, clen = src.cols(); j < clen; j++) {
switch (type) {
case 0://0 缩小为原来的1/2并剧中
if (i > rlen * 0.25 && i < rlen * 0.75 && j > clen * 0.25 && j < clen * 0.75) {
xmat.put(i,j,2*(j-clen*0.25));
ymat.put(i,j,2*(i-rlen*0.25));
} else {
xmat.put(i,j,255);
ymat.put(i,j,255);
}
break;
case 1://1 上下对调(X轴对称)
xmat.put(i,j,j);
ymat.put(i,j,rlen-i-1);
break;
case 2://2 左右对调(Y轴对称)
xmat.put(i,j,clen-j-1);
ymat.put(i,j,i);
break;
case 3://3 上下左右对调(XY轴对称)
xmat.put(i,j,clen-j-1);
ymat.put(i,j,rlen-i-1);
break;
default:
break;
}
}
}
/*
* 函数remap使用指定的映射来转换源图像: 此功能无法就地运行。
* @param src源图像。
* @param dst目标图像。它的大小与map1相同,类型与src相同。
* @param map1(x,y)点或仅x个值的第一个映射,类型为CV_16SC2,CV_32FC1或CV_32FC2。
* @param map2分别具有CV_16UC1,CV_32FC1或无类型的y值的第二个映射(如果map1为(x,y)点,则为空映射)。
* @param插值插值方法(请参阅#InterpolationFlags)。此函数不支持方法#INTER_AREA。
* @param borderMode像素外推方法(请参阅#BorderTypes)。当borderMode
* =#BORDER_TRANSPARENT时,表示目标图像中与源图像中的“离群值”相对应的像素未被该函数修改。
* 最近邻插值法 cv.INTER_NEAREST
* 双线性插值法 cv.INTER_LINEAR
* 双三次插值法 cv.INTER_CUBIC
* 区域插值法 cv.INTER_AREA
* 兰索斯插值法 cv.INTER_LANCZOS4
* BorderTypes 详见:https://blog.csdn.net/ren365880/article/details/103933835
* @param borderValue在恒定边框的情况下使用的值。默认情况下为0。 注意:
* 由于当前的实现限制,输入和输出图像的大小应小于32767x32767。
*/
Imgproc.remap (src,dst,xmat,ymat,Imgproc.INTER_CUBIC,Core.BORDER_REPLICATE,new Scalar(0, 0, 0));
HighGui.imshow("图像重映射", dst);
HighGui.waitKey(0);
}
}
OpenCV Java 图像重映射
于 2020-01-13 14:16:07 首次发布