当前位置: 首页 > >

OpenCV java 图片处理,蒙太奇图片(13)

发布时间:

原文地址:


https://blog.csdn.net/Ricardo232525/article/details/78088772


素材准备:


?我在网上下载了150张狗狗的图片,然后重命名为0-150.jpg


代码:

String filename = "D:\svnp\MyYan\res\drawable\lena.png";
Mat src = Imgcodecs.imread(filename);//加载需要被蒙太奇的图片,原图

// 计算尺度大小这里是像素
int rows = src.rows();
int cols = src.cols();

// 50x50个像素作为新图片的大小网格,覆盖整个图片需要多少个网格
int ColRows = (int) rows / 50;
int ColCols = (int) cols / 50;

//全覆盖
ColRows = (ColRows * 50 < rows) ? ColRows + 1 : ColRows;
ColCols = (ColCols * 50 < cols) ? ColCols + 1 : ColCols;

//创建输出图片
Mat output = new Mat(ColRows * 50, ColCols * 50, CvType.CV_8UC3, new Scalar(255, 255, 255));
int colorN = 0;
Mat picColor;
Mat tmpS;

//循环加载
for (int i = 0; i < ColRows; ++i) {
for (int j = 0; j < ColCols; ++j) {
filename = "D:\360MoveData\Users\lxn\Desktop\opencvtest\";

filename += colorN + ".jpg";
picColor = Imgcodecs.imread(filename);
// 将素材照片缩放到50*50
Imgproc.resize(picColor, picColor, new Size(50, 50));
picColor.convertTo(picColor, CvType.CV_8UC3);//图片通道转换
tmpS = new Mat(output, new Rect(j * 50, i * 50, 50, 50));//获取到output的一块网格 tmpS对应 但是output元素上的地址
picColor.copyTo(tmpS);//用picColor的元素覆盖tmps元素
colorN++;
if (colorN >= 160) {
colorN = 0;
}
}
}


for (int i = 1; i < rows; ++i) {
for (int j = 1; j < cols; ++j) {
// 像素RGB值修改
double[] d = new double[3];
d[0] = 0.382 * output.get(i, j)[0] + 0.618 * src.get(i, j)[0];
d[1] = 0.382 * output.get(i, j)[1] + 0.618 * src.get(i, j)[1];
d[2] = 0.382 * output.get(i, j)[2] + 0.618 * src.get(i, j)[2];
output.put(i, j, d);
}
}

output = new Mat(output, new Rect(0, 0, cols, rows));

// 加载图片

HighGui.imshow("原图", src);
HighGui.imshow("蒙太奇", output);
// HighGui.imshow("矩形操作", dst2);
//
HighGui.waitKey(0);

最终结果:


图片蒙太奇中用到了一些矩阵的操作比如说converTo和copyTo,以及resize


和矩阵对应的rgb元素的赋值


算是对我们前面学*到的opencv的一个简单的练*


希望对你有所帮助


?



友情链接: