OpenCV学习之路---JAVA

标题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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值