参考链接:
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