本示例主要基于addWeighted图像的叠加/线性混合函数实现。
addWeighted函数简介如下:
/**
* addWeighted之图像的叠加/线性混合
* addWeighted(
* Mat src1, //进行加权操作的第一个图像对象,即输入图片1;
* double alpha, //第一个图像的加权系数,即图片1的融合比例;
* Mat src2, //进行加权操作的第二个图像对象,即输入图片2;
* double beta, //第二个图像的加权系数,即图片2的融合比例。很多情况下,有关系 alpha + beta = 1.0;
* double gamma, //表示一个作用到加权和后的图像上的标量,可以理解为加权和后的图像的偏移量;
* Mat dst, //加权和后的图像
* int dtype=-1 //输出阵列的可选深度,有默认值 - 1。
* )
*/
@Test
public void testAddWeighted() {
//src 和src1 尺寸要一致
Mat src = GeneralUtils.converMat("C:\\图片\\test\\0001.jpg");
Mat src1 = GeneralUtils.converMat("C:\\图片\\test\\0002.jpg");
Mat weighted = new Mat();
//线性混合,得到混合图片
Core.addWeighted(src, 1.5, src1, -0.5, 0, weighted);
GeneralUtils.saveByteImg(weighted, "C:\\图片\\test\\weighted.jpg");
}
图片水印具体步骤如下:
@Test
public void test() {
Mat src = GeneralUtils.converMat("C:\\图片\\test\\0001.jpg");
//把原图缩小为100x100的图片,当做水印
Mat mask = new Mat();
Imgproc.resize(src, mask, new Size(100, 100));
//水印位置
Rect rect = new Rect(0, 0, 100, 100);
Mat src_roi = new Mat(src, rect);
//生成水印
Core.addWeighted(src_roi, 0.5, mask, 0.5, 0, weighted);
//将生成的水印覆盖原来水印位置
Mat dstMat = new Mat(src, rect);
weighted.copyTo(dstMat);
GeneralUtils.saveByteImg(src, "C:\\图片\\test\\dstMat.jpg");
}