- 本节内容:每个像素点的位操作。常见的有与或非、异或、同或等。
- 与、或、异或是针对两张图像的位操作;还可以针对一张图像进行位操作:bitwise_not。
- 将每个通道、每个像素值变为8位的值,然后进行位操作。
图像有三个通道,对每个通道都需要进行位操作,得到下边结果:
- 与操作:两个都为1结果才为1。产生一个红色矩形:黄色255=红色255+绿色255
- 异或操作:相同为0,不同为1
- 或操作:有1个为1则结果为1
C++
#include
#include
using namespace cv;
using namespace std;
int main(int argc, const char *argv[])
{
// create image one
Mat src1 = Mat::zeros(Size(400, 400), CV_8UC3); //创建图像,BGR
Rect rect(100, 100, 100, 100); //构造一个矩形Rect,四个参数为(左上x,左上y,宽,高)
src1(rect) = Scalar(0, 0, 255); //填充
imshow("input1", src1);
printf("create first image...\n");
// create image two
Mat src2 = Mat::zeros(Size(400, 400), CV_8UC3);
rect.x = 150;
rect.y = 150;
src2(rect) = Scalar(0, 0, 255);
imshow("input2", src2);
printf("create second image...\n");
// 逻辑操作
Mat dst1, dst2, dst3;
bitwise_and(src1, src2, dst1); //与,常用于mask,图像与mask图像做与操作,可取到mask指定的区域
bitwise_xor(src1, src2, dst2); //异或
bitwise_or(src1, src2, dst3); //或
// show results
imshow("dst1", dst1);
imshow("dst2", dst2);
imshow("dst3", dst3);
Mat src = imread("D:/vcprojects/images/test.png");
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
// 取反操作
Mat dst;
bitwise_not(src, dst); //取反,常用于二值图像取反
imshow("dst", dst);
waitKey(0);
return 0;
}
Python
import cv2 as cv
import numpy as np
# create image one
src1 = np.zeros(shape=[400, 400, 3], dtype=np.uint8) #创建图像
src1[100:200, 100:200, 1] = 255 #对高100:200、宽100:200的区域的第一个通道,赋值255(通道为BGR,从0索引)
src1[100:200, 100:200, 2] = 255
cv.imshow("input1", src1)
# create image two
src2 = np.zeros(shape=[400, 400, 3], dtype=np.uint8)
src2[150:250, 150:250, 2] = 255
cv.imshow("input2", src2)
dst1 = cv.bitwise_and(src1, src2)
dst2 = cv.bitwise_xor(src1, src2)
dst3 = cv.bitwise_or(src1, src2)
cv.imshow("dst1", dst1)
cv.imshow("dst2", dst2)
cv.imshow("dst3", dst3)
src = cv.imread("D:/vcprojects/images/test.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
dst = cv.bitwise_not(src)
cv.imshow("dst", dst)
cv.waitKey(0)
cv.destroyAllWindows()