
图像的运算
按位运算
按位非运算
也叫反相,就是将像素的颜色变成与原来相反的颜色,相当于照片的底片效果。
java
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
public class Bitwise_not {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//读取图像文件并在屏幕上显示
Mat src=Imgcodecs.imread("C:\\Users\\Think\\Desktop\\TestCV\\fish.png");
HighGui.imshow("src", src);
HighGui.waitKey(0);
//取反操作获得底片效果
Mat dst=new Mat();
Core.bitwise_not(src, dst);
//在屏幕上显示底片效果
HighGui.imshow("negative", dst);
HighGui.waitKey(0);
System.exit(0);
}
}
按位与运算
由于黑色的像素每位都是0,而0无论与0还是1进行运算都是0,因此,可以实现抠图的效果。
java
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class Bitwise_and {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//读取图像文件并在屏幕上显示
Mat src=Imgcodecs.imread("C:\\Users\\Think\\Desktop\\TestCV\\fish.png", Imgcodecs.IMREAD_GRAYSCALE);
HighGui.imshow("src", src);
HighGui.waitKey(0);
//创建一个窗口图像,背景为全黑,中央区域有一个白色的实心矩形
Scalar white = new Scalar(255,255,255);
Mat window=Mat.zeros(src.size(), CvType.CV_8UC1);
Imgproc.rectangle(window, new Point(400, 40), new Point(660, 250), white, -1);
//在屏幕上显示窗口图像
HighGui.imshow("window", window);
HighGui.waitKey(0);
//进行按位与操作
Mat dst=new Mat();
Core.bitwise_and(src, window, dst);
//在屏幕上显示结果
HighGui.imshow("dst", dst);
HighGui.waitKey(0);
System.exit(0);
}
}
按位或运算
也很好理解。1 or 其他都是 1
java
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class Bitwise_or {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//读取图像文件并在屏幕上显示
Mat src=Imgcodecs.imread("C:\\Users\\Think\\Desktop\\TestCV\\fish.png", Imgcodecs.IMREAD_GRAYSCALE);
HighGui.imshow("src", src);
HighGui.waitKey(0);
//创建一个窗口图像,背景为全白,中央区域有一个黑色的实心矩形
Scalar black = new Scalar(0,0,0);
Mat window=new Mat (src.size(), CvType.CV_8UC1, new Scalar(255));
Imgproc.rectangle(window, new Point(160, 60), new Point(350, 240), black, -1);
//在屏幕上显示窗口图像
HighGui.imshow("window", window);
HighGui.waitKey(0);
//进行按位或操作
Mat dst=new Mat();
Core.bitwise_or(src, window, dst);
//在屏幕上显示结果
HighGui.imshow("dst", dst);
HighGui.waitKey(0);
System.exit(0);
}
}
按位异或运算
特点:如果同为0或者1,结果就是0,否则就是1,异或操作有一个特殊之处就是,任意一个数经过两次异或后又会变成这个数的本身。
text
a=0 1 1 0 1 1 1 0
b=0 1 0 1 0 1 0 1
第一次异或:a^b= 0 0 1 1 1 0 1 1
第一次异或:a^b^b= 0 1 1 0 1 1 1 0 = a
利用这个特点可以实现图片的加密和解密。
java
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
public class Bitwise_xor {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//读取待加密图像并在屏幕上显示
Mat src=Imgcodecs.imread("C:\\Users\\Think\\Desktop\\TestCV\\church.png");
HighGui.imshow("src", src);
HighGui.waitKey(0);
//读取密钥图像并在屏幕上显示
Mat key=Imgcodecs.imread("C:\\Users\\Think\\Desktop\\TestCV\\key.jpg");
HighGui.imshow("key", key);
HighGui.waitKey(0);
//按位异或加密图像并在屏幕上显示
Mat dst=new Mat();
Core.bitwise_xor(src, key, dst);
HighGui.imshow("encrypted", dst);
HighGui.waitKey(0);
//再次执行按位异或操作解密图像并在屏幕上显示
Core.bitwise_xor(dst, key, dst);
HighGui.imshow("decrypted", dst);
HighGui.waitKey(0);
System.exit(0);
}
}