标题OpenCV给图片上logo
直接上代码
代码是在 使用 alexliu / OpenCV3-Study-JAVA 的学习代码学习的时候发现有bug,然后在OpenCV图像处理–为图像添加Logo 找到方法(吐槽:python果然写起来简单好多。Java对象我都多new了好多个,烦死了Java是最好的语言 ),经过探索得到的方法。
import org.junit.Test;
import org.opencv.core.*;
//import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
/**
*注意:1、代码中的路径需要自己配
* 2、this.saveImage(); 需要自己写,就一个保存代码。也可以使用HighGui查看
*//
@Test
public void testROI_1(){
// 读取彩色图,
Mat sourceImage = Imgcodecs.imread(this.p_test_file_path + "/youImage.jpg",Imgcodecs.IMREAD_COLOR);
// 读取logo 尽量用读取原图
Mat logoImage = Imgcodecs.imread(this.p_test_file_path + "/![yourLogo](https://img-blog.csdnimg.cn/20210119104811887.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FpdXhpbmdjaGVuZw==,size_16,color_FFFFFF,t_70#pic_center)
.jpeg",Imgcodecs.IMREAD_ANYCOLOR);
//直接读取图片为灰度图,作为 mask(遮罩)
Mat mask = Imgcodecs.imread(this.p_test_file_path + "/yourLogo.jpeg",Imgcodecs.IMREAD_GRAYSCALE);
this.saveImage(this.save_dir + "/mask.png",mask);
//图像二值化
Mat img_logo_mask=new Mat(logoImage.rows(),logoImage.cols(),CvType.CV_8UC4);
Imgproc.threshold(mask,img_logo_mask,200,255,Imgproc.THRESH_BINARY);
this.saveImage(this.save_dir + "/img_logo_mask.png",img_logo_mask);
//反色
Mat img_logo_mask1=new Mat(logoImage.rows(),logoImage.cols(),CvType.CV_8UC4);
Core.bitwise_not(img_logo_mask,img_logo_mask1);
this.saveImage(this.save_dir + "/img_logo_mask1.png",img_logo_mask1);
//根据 logo 的宽高,在原图上划定感兴趣区域
Mat mat_roi = sourceImage.submat(new Rect(30,30,logoImage.cols(),logoImage.rows()));
//image.copyTo(imageROI,mask)
// 作用是把mask和image重叠以后把mask中像素值为0(black)的点对应的image中的点变为透明,而保留其他点。
logoImage.copyTo(mat_roi,img_logo_mask1);
this.saveImage(this.save_dir + "/ROI_add_area_image_2.png",sourceImage);
}
图片二值化问题记录
/**
* ThresholdTypes:
* THRESH_BINARY = 0, 二进制阈值化
* THRESH_BINARY_INV = 1, 反二进制阈值化
* THRESH_TRUNC = 2, 截断阈值化
* THRESH_TOZERO = 3, 阈值化为0
* THRESH_TOZERO_INV = 4, 反阈值化为0
* THRESH_MASK = 7,
* THRESH_OTSU = 8, 使用Otsu算法选择最优阈值
* THRESH_TRIANGLE = 16; 采用三角形算法选择最优阈值
*
* @param thresh 阈值
* @param maxval 与#THRESH_BINARY和#THRESH_BINARY_INV阈值类型一起使用的最大值。
* @param type thresholding type (see #ThresholdTypes).
*/
public static double threshold(Mat src, Mat dst, double thresh, double maxval, int type) {
return threshold_0(src.nativeObj, dst.nativeObj, thresh, maxval, type);
}
参考
threshold:opencv学习(二十八)之基本图像阈值操作threshold
mask:OpenCV之bitwise_and、bitwise_not等图像基本运算及掩膜
python实现方法:OpenCV图像处理–为图像添加Logo
Java学习资料: alexliu / OpenCV3-Study-JAVA