內容:
1.與或非
2.利用帶mask操作
1.取反操作
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
// 讀入圖像
Mat src = imread("../chaoxiong.jpg");
imshow("input",src);
// 圖像取反
Mat m1;
// 取反API
//Mat mask = Mat::zeros(src.size(),CV_8UC1);
bitwise_not(src,m1,Mat());
imshow("bitwise not",m1);
waitKey(0);
destroyAllWindows();
return 0;
}
原圖:
取反後:
添加mask後,意爲src進行取反時參照mask,取反的值放在m1中,若mask的像素值爲0時(mask要麼爲0,要麼爲255),取反的值是不放在m1中的,當mask的值不爲0時,才把取反的值放到m1中,所以這裏m1是沒有存放取反結果的,爲全黑:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
// 讀入圖像
Mat src = imread("../chaoxiong.jpg");
imshow("input",src);
// 圖像取反
Mat m1;
// 取反API
// mask的類型必須是CV_8UC1
Mat mask = Mat::zeros(src.size(),CV_8UC1);
// 意爲src進行取反時參照mask,取反的值放在m1中,若mask的像素值爲0時(mask要麼爲0,要麼爲255),取反的值是不放在m1中的,當mask的值不爲0時,才把取反的值放到m1中
// 所以這裏m1是沒有存放取反結果的,爲全黑
bitwise_not(src,m1,mask);
imshow("bitwise not",m1);
waitKey(0);
destroyAllWindows();
return 0;
}
所以這裏m1是沒有存放取反結果的,爲全黑:
運用mask上面的特性可以進行部分取反:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
// 讀入圖像
Mat src = imread("../chaoxiong.jpg");
imshow("input",src);
// 圖像取反
Mat m1;
Mat mask = Mat::zeros(src.size(),CV_8UC1);
// 越界管理
int w = src.cols/2;
int h = src.rows/2;
for(int row = 0;row < h; row++)
{
for(int col = 0;col < w; col++)
{
mask.at<uchar>(row,col) = 255;
}
}
imshow("mask",mask);
bitwise_not(src,m1,mask);
imshow("bitwise not",m1);
waitKey(0);
destroyAllWindows();
return 0;
}
運行結果:
可以發現,只有mask圖像中白色的區域才被取反。
2.與操作
先與自身進行與操作,輸出的依然是原圖:
Mat m2;
// 原圖與原圖進行與操作
bitwise_and(src,src,m2,Mat());
imshow("bitwise and",m2);
對指定的mask區域:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
// 讀入圖像
Mat src = imread("../chaoxiong.jpg");
//imshow("input",src);
// 圖像取反
Mat m1;
Mat mask = Mat::zeros(src.size(),CV_8UC1);
// 越界管理
int w = src.cols/2;
int h = src.rows/2;
for(int row = 0;row < h; row++)
{
for(int col = 0;col < w; col++)
{
mask.at<uchar>(row,col) = 255;
}
}
//imshow("mask",mask);
bitwise_not(src,m1,mask);
// 取mask區域的原圖,與操作
Mat m2;
// 原圖與原圖進行與操作
bitwise_and(src,src,m2,mask);
imshow("bitwise and",m2);
waitKey(0);
destroyAllWindows();
return 0;
}
輸出結果:
改變數值:
for(int row = 150;row < h+200; row++)
{
for(int col = 280;col < w+150; col++)
{
mask.at<uchar>(row,col) = 255;
}
}
結果爲:
3.或運算
或操作中得到的值一直都是值更大的那個。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
// 讀入圖像
Mat src = imread("../chaoxiong.jpg");
//imshow("input",src);
// 圖像取反
Mat m1;
Mat mask = Mat::zeros(src.size(),CV_8UC1);
Mat mask1 = Mat::zeros(src.size(),CV_8UC1);
// 越界管理
int w = src.cols/2;
int h = src.rows/2;
for(int row = 150;row < h+200; row++)
{
for(int col = 280;col < w+150; col++)
{
mask.at<uchar>(row,col) = 127;
mask1.at<uchar>(row,col) = 0;
}
}
//imshow("mask",mask);
bitwise_not(src,m1,mask);
Mat m3;
// 或操作中得到的值一直都是值更大的那個
bitwise_or(mask,mask1,m3);
imshow("bitwise and",m3);
waitKey(0);
destroyAllWindows();
return 0;
}