Java OpenCv bitwise运算,掩膜


参考链接:
https://blog.csdn.net/yl_best/article/details/87877110
https://www.cnblogs.com/skyfsm/p/6894685.html

基本位运算

理论说明

运算运算结果类比举例
AND两个都不为零 – 真,返回1
其他情况 – 假,返回0
交集二进制:[0000 0011] AND [0010 0010] = [0000 0010]
十进制:3 AND 34= 2
OR返回的是按位或运算结果
有一个不为零–真,返回1
两个都为零 --假,返回0
并集二进制:[0000 0011] OR [0010 0010] = [0010 0011]
十进制:3 OR 34= 35
XOR两个数不一样-- 真,返回1
两个数相等 – 假,返回0
N/A二进制:[0000 0011] XOR [0010 0010] = [0010 0001]
十进制:3 XOR 34= 33
NOT反转数组的每一位(bit)N/A二进制:NOT [0000 0011] = [1111 1100]
十进制:NOT 3 = 252

代码举例

import org.opencv.core.*;

public class Test {

    public static void main(String[] args) {
        System.load("F:\\opencv\\x64\\opencv_java401.dll");

        System.out.println("----------or---------");
        // or:
        // 大白话为or结果图的像素值为,两张操作图大的像素值
        // (255, 0, 6),(3, 10, 6) == > (255, 10, 6)
        Mat orSrc1 = new Mat(1, 1, CvType.CV_8UC3);
        double[] orSrc1Color = {255, 0, 6};
        orSrc1.put(0, 0, orSrc1Color);

        Mat orSrc2 = new Mat(1, 1, CvType.CV_8UC3);
        double[] orSrc2Color = {3, 10, 6};
        orSrc2.put(0, 0, orSrc2Color);

        Mat or = new Mat();
        Core.bitwise_or(orSrc1, orSrc2, or);

        System.out.println(or.get(0, 0)[0]); // 255
        System.out.println(or.get(0, 0)[1]); // 10
        System.out.println(or.get(0, 0)[2]); // 6
        System.out.println("-------------------");


        System.out.println("----------and---------");
        // and
        // 大白话为and结果图的像素值为,两张操作图小的像素值
        // (255, 0, 6),(3, 10, 6) == > (3, 0, 6)
        Mat andSrc1 = new Mat(1, 1, CvType.CV_8UC3);
        double[] andSrc1Color = {255, 0, 6};
        andSrc1.put(0, 0, andSrc1Color);

        Mat andSrc2 = new Mat(1, 1, CvType.CV_8UC3);
        double[] andSrc2Color = {3, 10, 6};
        andSrc2.put(0, 0, andSrc2Color);

        Mat and = new Mat();
        Core.bitwise_and(andSrc1, andSrc2, and);

        System.out.println(and.get(0, 0)[0]); // 3
        System.out.println(and.get(0, 0)[1]); // 0
        System.out.println(and.get(0, 0)[2]); // 6
        System.out.println("-------------------");


        System.out.println("----------not---------");
        // not
        // 大白话为当前像素值x变为255-x
        // (255, 0, 10) == > (255 - 255, 255 - 0, 255 - 10) == > (0, 255, 245)
        Mat notSrc = new Mat(1, 1, CvType.CV_8UC3);
        double[] notSrcColor = {255, 0, 10};
        notSrc.put(0, 0, notSrcColor);
        Mat not = new Mat();
        Core.bitwise_not(notSrc, not);
        System.out.println(not.get(0, 0)[0]); // 0
        System.out.println(not.get(0, 0)[1]); // 255
        System.out.println(not.get(0, 0)[2]); // 245
        System.out.println("-------------------");

        System.out.println("----------xor---------");
        // xor
        // 大白话为目标像素值为两张操作图数值大的像素值 - 像素小的像素值
        // (255, 2, 6), (1, 10, 6) == 》 (255 -1, 10 - 2, 6 - 6) == > (254, 8, 0)
        Mat xorSrc1 = new Mat(1, 1, CvType.CV_8UC3);
        double[] xorSrc1Color = {255, 2, 6};
        xorSrc1.put(0, 0, xorSrc1Color);

        Mat xorSrc2 = new Mat(1, 1, CvType.CV_8UC3);
        double[] xorSrc2Color = {1, 10, 6};
        xorSrc2.put(0, 0, xorSrc2Color);

        Mat xor = new Mat();
        Core.bitwise_xor(xorSrc1, xorSrc2, xor);

        System.out.println(xor.get(0, 0)[0]); // 254
        System.out.println(xor.get(0, 0)[1]); // 8
        System.out.println(xor.get(0, 0)[2]); // 0
        System.out.println("-------------------");
    }
}

掩膜

理论说明

Masking(掩膜运算) 即图与掩膜的“按位与”运算:

原图中的每个像素和掩膜(Mask)中的每个对应像素进行按位与运算,

如果为真,结果是原图的值

如果为假,结果就是零

说白了,mask就是位图啊,来选择哪个像素允许拷贝,哪个像素不允许拷贝。如果mask像素的值是非0的,我就拷贝它,否则不拷贝。
因为我们得到的mask中,感兴趣的区域是白色的,表明感兴趣区域的像素都是非0,而非感兴趣区域都是黑色,表明那些区域的像素都是0。一旦原图与mask图进行与运算后,得到的结果图只留下原始图感兴趣区域的图像了。

import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Test {

    public static void main(String[] args) {
        System.load("D:\\opencv\\build\\java\\x64\\opencv_java401.dll");

        Mat rectangle = Imgcodecs.imread("E:\\opencvPhoto\\photo\\rectangle.jpg");
        Mat circle = Imgcodecs.imread("E:\\opencvPhoto\\photo\\circle.jpg");

        Mat mask = new Mat(rectangle.size(), CvType.CV_8UC1, new Scalar(0));
        // 可以看到只要是非0就可以不一定要255
        Imgproc.rectangle(mask, new Point(10, 10)
                , new Point(rectangle.width() / 2, rectangle.height() / 2), new Scalar(100), -1);

        Imgcodecs.imwrite("E:\\opencvPhoto\\photo\\mask.jpg", mask);

        Mat or = new Mat();
        Core.bitwise_or(rectangle, circle, or);
        Imgcodecs.imwrite("E:\\opencvPhoto\\photo\\or.jpg", or);

        Mat maskOr = new Mat();
        Core.bitwise_or(rectangle, circle, maskOr, mask);
        Imgcodecs.imwrite("E:\\opencvPhoto\\photo\\maskOr.jpg", maskOr);

        Mat circleCopyMask = new Mat();
        circle.copyTo(circleCopyMask, mask);
        Imgcodecs.imwrite("E:\\opencvPhoto\\photo\\circleCopyMask.jpg", circleCopyMask);

    }

}

circle
在这里插入图片描述
rectangle
在这里插入图片描述
mask
在这里插入图片描述
or
在这里插入图片描述
maskOr
在这里插入图片描述
circleCopyMask
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值