内容:
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;
}