007 图像像素的逻辑操作

  • 本节内容:每个像素点的位操作。常见的有与或非、异或、同或等。
007 图像像素的逻辑操作_第1张图片
图像位操作
  • 与、或、异或是针对两张图像的位操作;还可以针对一张图像进行位操作:bitwise_not。
  • 将每个通道、每个像素值变为8位的值,然后进行位操作。
007 图像像素的逻辑操作_第2张图片
两张原图(黄色矩形左上角(100,100),红色图像左上角(150,150))

图像有三个通道,对每个通道都需要进行位操作,得到下边结果:


007 图像像素的逻辑操作_第3张图片
位操作结果
  • 与操作:两个都为1结果才为1。产生一个红色矩形:黄色255=红色255+绿色255
  • 异或操作:相同为0,不同为1
  • 或操作:有1个为1则结果为1
007 图像像素的逻辑操作_第4张图片
对原图取反的结果

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()

你可能感兴趣的:(007 图像像素的逻辑操作)