Opencv_06 图像的逻辑操作

按位操作

① 按位与说明
  1. 将对应像素位置的像素值进行位与操作.
  2. 两幅图像必须大小和类型相同,否则报错
  3. 可以提供一个掩膜Mask

Mask的作用:
Mask掩膜运算,本质上就是将原来的图像和掩膜进行按位与运算;
注意:不是简单的按位与运算:

  1. 如果和掩膜按位与之后结果为真,就保留原图像素
  2. 如果为假,结果就是0
  3. 如果为真,可能就转换为了1,和原来的数据进行位与
  1. Mask只能是二维矩阵,与原图的size大小一致
  2. 只能是单通道的矩阵
  3. 不管mask的值是10还是255,如果为真,其和1都是等价的效果,最后得到的结果都是保留原图的像素值
#include "MyOpencv.h"
int main(void)
{
	Mat m1 = Mat::zeros(3, 3, CV_8UC1);
	Mat m2 = Mat::ones(3, 4, CV_8UC1);
	Mat m3 = Mat::ones(3, 3, CV_8UC3);
	Mat m4 = Mat::ones(3, 3, CV_8UC1);
	Mat dst1;
	//cv::bitwise_and(m1, m2, dst1); // 报错
	//cv::bitwise_and(m1, m3, dst1); // 报错
	cv::bitwise_and(m1, m4, dst1);
	cout << "m1 & m4 = " << endl;
	cout << dst1 << endl;

	// 使用mask
	Mat mask = Mat::ones(3, 3, CV_8UC1)*2;
	cv::bitwise_and(m4, m4, dst1, mask = mask);
	cout << "m4 & m4 通过mask之后的值: " << endl;
	cout << dst1 << endl;
	
	return 0;
}

结果:

② 按位或操作
  1. 将对应像素做按位或操作
  2. 如果有掩膜,后面再跟掩膜进行运算,运算规则和bitwise_and一样
#include "MyOpencv.h"

int main(void)
{
	Mat src1 = Mat::zeros(Size(400, 400), CV_8UC3);
	Rect rect(100, 100, 100, 100);
	src1(rect) = Scalar(0, 0, 255); // BGR 红色
	imshow("Src1", src1);

	Mat src2 = Mat::zeros(Size(400, 400), CV_8UC3);
	rect.x = 150;
	rect.y = 150;
	src2(rect) = Scalar(0, 255, 255);// BGR 黄色
	imshow("Src2", src2);

	// 逻辑或操作
	Mat dst1;
	bitwise_or(src1, src2, dst1);
	imshow("bitwise_or", dst1);

	waitKey(0);

}

结果:

③ 按位异或操作
  1. 将对应像素按照按位异或进行操作
  2. 如果有掩膜,最后再跟掩膜进行运算,运算规则和bitwise_and一样
#include "MyOpencv.h"

int main(void)
{
	Mat src1 = Mat::zeros(300, 300, CV_8UC3);
	Mat src2 = Mat::zeros(300, 300, CV_8UC3);
	Rect rect(100, 100, 100, 100);
	src1(rect) = Scalar(255, 0, 0);// 蓝色
	rect.x = 150;
	rect.y = 150;
	src2(rect) = Scalar(255, 255, 0);
	Mat dst;
	// 异或,相同部分为0,不同部分为0,所以和0异或结果不变. 
	// (255,0,0) | (255,255,0) -> (0,255,0) 所以重合部分变成了绿色
	bitwise_xor(src1, src2, dst);
	imshow("Src1", src1);
	imshow("Src2", src2);
	imshow("Src1 | Src2", dst);

	waitKey(0);

	return 0;
}

结果:

④ 取反 bitwise_not
  1. 取反操作,就是做位取反,0变成1,1变成0.
  2. 如果提供了mask,取反之后再和mask进行运算

原型:

void bitwise_not(InputArray src,OutputArray dst,InputArray mask = noArray()); // dst = ~src;
#include "MyOpencv.h"

int main(void)
{
	Mat src1 = cv::Mat(Size(300, 300), CV_8UC3, Scalar(0, 0, 0)); // 一开始都是黑色
	Mat src2 = cv::Mat(Size(300, 300), CV_8UC3, Scalar(0, 0, 0)); // 一开始都是黑色
	Rect rect(100, 100, 100, 100);
	src1(rect) = Scalar(255, 0, 0); // 蓝色
	rect.x = 150;
	rect.y = 150;
	src2(rect) = Scalar(0, 255, 255); // 黄色

	// 将蓝色的反转
	Mat dst;
	bitwise_not(src1, dst);
	imshow("Src_1_Not", dst);
	bitwise_not(src2, dst);
	imshow("Src1", src1);
	imshow("Src2", src2);
	imshow("Src_2_Not", dst);

	// 只反转敢兴趣的区域,其他的区域不变,例如其他的区域还是维持黑色
	Mat mask = cv::Mat(Size(300, 300), CV_8UC1, Scalar(0));
	rect.x = 100;
	rect.y = 100;
	mask(rect) = Scalar(1);

	Mat mask2 = cv::Mat(Size(300, 300), CV_8UC1, Scalar(0));
	rect.x = 150;
	rect.y = 150;
	mask2(rect) = Scalar(1);
	Mat dst2;
	bitwise_not(src1, dst2,mask);
	imshow("src1_not_mask", dst2);
	Mat dst3;
	bitwise_not(src2, dst3, mask2);
	imshow("src2_not_mask", dst3);

	waitKey(0);

	return 0;
}

结果:

在这里插入图片描述
总结:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
code_001 | [图片读取与显示](python/code_001/opencv_001.py) | ✔️ code_002 | [图片灰度化](python/code_002/opencv_002.py) | ✔️ code_003 | [图像创建与赋值](python/code_003/opencv_003.py) | ✔️ code_004 | [图像像素读写](python/code_004/opencv_004.py) | ✔️ code_005 | [图像像素算术操作(加减乘除)](python/code_005/opencv_005.py) | ✔️ code_006 | [图像伪彩色增强](python/code_006/opencv_006.py) | ✔️ code_007 | [图像像素操作(逻辑操作)](python/code_007/opencv_007.py) | ✔️ code_008 | [图像通道分离合并](python/code_008/opencv_008.py) | ✔️ code_009 | [色彩空间与色彩空间转换](python/code_009/opencv_009.py) | ✏️ code_010 | [图像像素值统计](python/code_010/opencv_010.py) | ✔️ code_011 | [图像像素归一化](python/code_011/opencv_011.py) | ✔️ code_012 | [视频读写](python/code_012/opencv_012.py) | ✔️ code_013 | [图像翻转](python/code_013/opencv_013.py) | ✔️ code_014 | [图像插值](python/code_014/opencv_014.py) | ✔️ code_015 | [绘制几何形状](python/code_015/opencv_015.py) | ✔️ code_016 | [图像ROI与ROI操作](python/code_016/opencv_016.py) | ✔️ code_017 | [图像直方图](python/code_017/opencv_017.py) | ✔️ code_018 | [图像直方图均衡化](python/code_018/opencv_018.py) | ✏️ code_019 | [图像直方图比较](python/code_019/opencv_019.py) | ✔️ code_020 | [图像直方图反向投影](python/code_020/opencv_020.py) | ✔️ code_021 | [图像卷积操作](python/code_021/opencv_021.py) | ✔️ code_022 | [图像均值与高斯模糊](python/code_022/opencv_022.py) | ❣️ code_023 | [中值模糊](python/code_023/opencv_023.py) | ✔️ code_024 | [图像噪声](python/code_024/opencv_024.py) | ✔️ code_025 | [图像去噪声](python/code_025/opencv_025.py) | ✔️ code_026 | [高斯双边模糊](python/code_026/opencv_026.py) | ✔️ code_027 | [均值迁移模糊(mean-shift blur)](python/code_027/opencv_027.py) | ✔️ code_028 | [图像积分图算法](python/code_028/opencv_028.py) | ✔️ code_029 | [快速的图像边缘滤波算法](python/code_029/opencv_029.py) | ✔️ code_030 | [自定义滤波器](python/code_030/opencv_030.py) | ✔️ code_031 | [Sobel算子](python/code_031/opencv_031.py) | ✔️ code_032 | [更多梯度算子](python/code_032/opencv_032.py) | ✔️ code_033 | [拉普拉斯算子(二阶导数算子)](python/code_033/opencv_033.py) | ✔️ code_034 | [图像锐化](python/code_034/opencv_034.py) | ✔️ code_035 | [USM 锐化增强算法](python/code_035/opencv_035.py) | ✔️ code_036 | [Canny边缘检测器](python/code_036/opencv_036.py) | ❣️ code_037 | [图像金字塔](python/code_037/opencv_037.py) | ✔️ code_038 | [拉普拉斯金字塔](python/code_038/opencv_038.py) | ✔️ code_039 | [图像模板匹配](python/code_039/opencv_039.py) | ✔️ code_040 | [二值图像介绍](python/code_040/opencv_040.py) | ✔️ code_041 | [基本阈值操作](python/code_041/opencv_041.py) | ✔️ code_042 | [图像二值寻找法OTSU](python/code_042/opencv_042.py) | ✏️ code_043 | [图像二值寻找法TRIANGLE](python/code_043/opencv_043.py) | ✔️ code_044 | [图像自适应阈值算法](python/code_044/opencv_044.py) | ✏️ code_045 | [图像二值与去噪](python/code_045/opencv_045.py) | ✏️ code_046 | [图像连通组件寻找](python/code_046/opencv_046.py) | ✔️ code_047 | [图像连通组件状态统计](python/code_047/opencv_047.py) | ✔️ code_048 | [轮廓寻找](python/code_048/opencv_048.py) | ❣️ code_049 | [轮廓外接矩形](python/code_049/opencv_049.py) | ❣️ code_050 | [轮廓矩形面积与弧长](python/code_050/opencv_050.py) | ✏️ code_051 | [轮廓逼近](python/code_051/opencv_051.py) | ✔️ code_052 | [几何矩计算中心](python/code_052/opencv_052.py) | ✔️ code_053 | [使用Hu矩阵实现轮廓匹配](python/code_053/opencv_053.py) | ✔️ code_054 | [轮廓圆与椭圆拟合](python/code_054/opencv_054.py) | ✔️ code_055 | [凸包检测](python/code_055/opencv_055.py) | ✏️ code_056 | [直线拟合与极值点寻找](python/code_056/opencv_056.py) | ✔️ code_057 | [点多边形测试](python/code_057/opencv_057.py) | ✔️ code_058 | [寻找最大内接圆](python/code_058/opencv_058.py) | ✔️ code_059 | [霍夫曼直线检测](python/code_059/opencv_059.py) | ✔️ code_060 | [概率霍夫曼直线检测](python/code_060/opencv_060.py) | ❣️ code_061 | [霍夫曼圆检测](python/code_061/opencv_061.py) | ❣️ code_062 | [膨胀和腐蚀](python/code_062/opencv_062.py) | ❣️ code_063 | [结构元素](python/code_063/opencv_063.py) | ✔️ code_064 | [开运算](python/code_064/opencv_064.py) | ✏️ code_065 | [闭运算](python/code_065/opencv_065.py) | ✏️ code_066 | [开闭运算的应用](python/code_066/opencv_066.py) | ✏️ code_067 | [顶帽](python/code_067/opencv_067.py) | ✔️ code_068 | [黑帽](python/code_068/opencv_068.py) | ✔️ code_069 | [图像梯度](python/code_069/opencv_069.py) | ✔️ code_070 | [基于梯度的轮廓发现](python/code_070/opencv_070.py) | ✏️ code_071 | [击中击不中](python/code_071/opencv_071.py) | ✔️ code_072 | [缺陷检测1](python/code_072) | ✔️ code_073 | [缺陷检测2](python/code_073/opencv_073.py) | ✔️ code_074 | [提取最大轮廓和编码关键点](python/code_074) | ✔️ code_075 | [图像修复](python/code_075/opencv_075.py) | ✔️ code_076 | [图像透视变换应用](python/code_076/opencv_076.py) | ✏️ code_077 | [视频读写和处理](python/code_077/opencv_077.py) | ✏️ code_078 | [识别与跟踪视频中的特定颜色对象](python/code_078) | ✔️ code_079 | [视频分析-背景/前景 提取](python/code_079/opencv_079.py) | ✔️ code_080 | [视频分析–背景消除与前景ROI提取](python/code_080) | ✔️ code_081 | [角点检测-Harris角点检测](python/code_081) | ✔️ code_082 | [角点检测-Shi-Tomas角点检测](python/code_082) | ✏️ code_083 | [角点检测-亚像素角点检测](python/code_083) | ✔️ code_084 | [视频分析-KLT光流跟踪算法-1](python/code_084) | ✏️ code_085 | [视频分析-KLT光流跟踪算法-2](python/code_085) | ✏️ code_086 | [视频分析-稠密光流分析](python/code_086) | ✏️ code_087 | [视频分析-帧差移动对象分析](python/code_087/opencv_087.py) | ✔️ code_088 | [视频分析-均值迁移](python/code_088) | ✏️ code_089 | [视频分析-连续自适应均值迁移](python/code_089) | ✏️ code_090 | [视频分析-对象移动轨迹绘制](python/code_090) | ✔️ code_091 | [对象检测-HAAR级联分类器](python/code_091) | ✔️ code_092 | [对象检测-HAAR特征分析](python/code_092) | ✔️ code_093 | [对象检测-LBP特征分析](python/code_093/opencv_093.py) | ✔️ code_094 | [ORB 特征关键点检测](python/code_094) | ✏️ code_095 | [ORB 特征描述子匹配](python/code_095) | ✔️ code_096 | [多种描述子匹配方法](python/code_096) | ✏️ code_097 | [基于描述子匹配的已知对象定位](python/code_097) | ✏️ code_098 | [SIFT 特征关键点检测](python/code_097) | ✔️ code_099 | [SIFT 特征描述子匹配](python/code_097) | ✔️ code_100 | [HOG 行人检测](python/code_100/opencv_100.py) | ✔️ code_101 | [HOG 多尺度检测](python/code_101/opencv_101.py) | ✏️ code_102 | [HOG 提取描述子](python/code_102/opencv_102.py) | ✔️ code_103 | [HOG 使用描述子生成样本数据](python/code_103/opencv_103.py) | ✔️ code_104 | [(检测案例)-HOG+SVM 训练](python/code_104/opencv_104.py) | ✔️ code_105 | [(检测案例)-HOG+SVM 预测](python/code_105/opencv_105.py) | ✔️ code_106 | [AKAZE 特征与描述子](python/code_106) | ✔️ code_107 | [Brisk 特征与描述子](python/code_107) | ✔️ code_108 | [GFTT关键点检测](python/code_108) | ✔️ code_109 | [BLOB 特征分析](python/code_109) | ✔️

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值