一、知識點
1、圖像像素的邏輯操作,指的是位操作bitwise,與、或、非、異或等。
2、位操作簡介:
?
位1 ? ? 位2 ? ? 與and ? ? 或or ? ? 異或xor0 ? ? ? 0 ? ? ? ?0 ? ? ? ?0 ? ? ? ? 00 ? ? ? 1 ? ? ? ?0 ? ? ? ?1 ? ? ? ? 11 ? ? ? 0 ? ? ? ?0 ? ? ? ?1 ? ? ? ? 11 ? ? ? 1 ? ? ? ?1 ? ? ? ?1 ? ? ? ? 0
??
3、void rectangle(InputOutputArray img, Rect rec, const Scalar & color, int thickness = 1, int lineType = LINE_8, int shift = 0);
? (1)、在圖像上繪制或填充一個矩形。
? (2)、參數說明:
? ? ? img: 輸入、輸出參數,表示要繪制或填充矩形的圖像。
?? ? ?rec: 定義了矩形左上角位置、寬、高。
?? ? ?color: 矩形線框或填充的顏色。
?? ? ?thickness: >0時表示矩形線框粗細,<0時表示填充矩形。
?? ? ?lineType: 線條的類型,如8連通、4連通。
?? ? ?shift: 點坐標中的小數位數。
?? ? ?
4、void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());
? (1)、執行兩個數組的位與操作。
? (2)、參數說明:
? ? ? src1: 第一個輸入數組。
?? ? ?src2: 第二個輸入數組。 src1和src2大小和類型得相同。
?? ? ?dst: 輸出數組,src1 & src2的結果數組。
?? ? ?mask: 掩碼數組,可選。 這個數組是8位單通道,且大小和輸入數組相同,只有掩碼中的非零元素對應的輸入數組元素才會進行位與操作。 未指定掩碼,則對整個輸入數組進行位與操作。
5、void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());
? (1)、執行兩個數組的位或操作。
? (2)、參數說明:
? ? ? src1: 第一個輸入數組。
?? ? ?src2: 第二個輸入數組。 src1和src2大小和類型得相同。
?? ? ?dst: 輸出數組,src1 | src2的結果數組。
?? ? ?mask: 掩碼數組,可選。 這個數組是8位單通道,且大小和輸入數組相同,只有掩碼中的非零元素對應的輸入數組元素才會進行位或操作。 未指定掩碼,則對整個輸入數組進行位或操作。
6、void bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());
? (1)、執行兩個數組的異或操作。
? (2)、參數說明:
? ? ? src1: 第一個輸入數組。
?? ? ?src2: 第二個輸入數組。 src1和src2大小和類型得相同。
?? ? ?dst: 輸出數組,src1 ^ src2的結果數組。
?? ? ?mask: 掩碼數組,可選。 這個數組是8位單通道,且大小和輸入數組相同,只有掩碼中的非零元素對應的輸入數組元素才會進行異或操作。 未指定掩碼,則對整個輸入數組進行異或操作。
7、void bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray());
? (1)、取反數組的每一位。
? (2)、參數說明:
? ? ? src: 輸入數組。
?? ? ?dst: 輸出數組,!src的結果數組。
?? ? ?mask: 掩碼數組,可選。 這個數組是8位單通道,且大小和輸入數組相同,只有掩碼中的非零元素對應的輸入數組元素才會進行取反操作。 未指定掩碼,則對整個輸入數組進行取反操作。
二、示例代碼:
#include <iostream>
#include <opencv2/opencv.hpp>int main()
{cv::Mat m1 = cv::Mat::zeros(256, 256, CV_8UC3);cv::Mat m2 = cv::Mat::zeros(256, 256, CV_8UC3);cv::rectangle(m1, cv::Rect(100, 100, 80, 80), cv::Scalar(255, 255, 0), -1, cv::LINE_8, 0);cv::rectangle(m2, cv::Rect(150, 150, 80, 80), cv::Scalar(0, 255, 255), -1, cv::LINE_8, 0);cv::imshow("m1", m1);cv::imshow("m2", m2);//兩個矩形相交部分是(150, 150)到(180, 180)之間。//兩個矩形相交部分經過與后, 結果為BGR(0, 255, 0); 圖像其它像素經過與后,結果為BGR(0, 0, 0)。cv::Mat dst1;cv::bitwise_and(m1, m2, dst1);cv::imshow("bitwise_and", dst1);//兩個矩形相交部分經過或后,結果為BGR(255, 255, 255); 兩個矩形不相交部分原先是什么顏色, 或后結果仍為什么顏色; 圖像其它像素經過或后,結果為BGR(0, 0, 0)。cv::Mat dst2;cv::bitwise_or(m1, m2, dst2);cv::imshow("bitwise_or", dst2);//兩個矩形相交部分經過異或后,結果為BGR(255, 0, 255); 兩個矩形不相交部分原先是什么顏色, 或后結果仍為什么顏色; 圖像其它像素經過或后,結果為BGR(0, 0, 0)。cv::Mat dst3;cv::bitwise_xor(m1, m2, dst3);cv::imshow("bitwise_xor", dst3);//m1矩形經過非后,結果為BGR(0, 0, 255); 圖像其它像素經過非后,結果為BGR(255, 255, 255)。cv::Mat dst4;cv::bitwise_not(m1, dst4);cv::imshow("bitwise_not", dst4);cv::waitKey(0);return 0;
}
運行結果: