OpenCV中掩膜(Mask)、setTo()、copyTo()、clone()、inRange()的定义与使用

1、掩膜(Mask)是什么

1从物理的角度来看

光刻是指利用光学复制的方法把pcb电路图印制在光敏记录材料上这个光敏材料就是很薄的一层膜我称之为掩膜Mask用掩膜Mask 遮盖硅片把掩膜Mask 上精细的电路图通过光线的曝光印制到硅片上来制作芯片

2图像处理中的掩膜Mask

图像掩膜与其类似用选定的图像作为遮挡来控制图像处理的区域

3掩膜的用法
  • 提取感兴趣区用预先制作的感兴趣区掩膜 与 待处理图像相乘得到感兴趣区图像感兴趣区内图像值保持不变而区外图像值都为0
  • 屏蔽作用用掩膜对图像上某些区域作屏蔽使其不参加处理仅对屏蔽区外作处理
  • 结构特征提取用相似性变量或图像匹配方法检测和提取图像中与掩膜相似的结构特征
  • 特殊形状图像的制作
4掩膜Mask 的运算

一个3 * 3的图像 与 一个3 * 3的掩膜进行运算得到的结果图像如下

在这里插入图片描述

2、setTo()函数将图像的像素值设置为某个值

1函数使用
src.setTo(value);		// 将图像src的值全部设成value
src.setTo(value, src<m);	// src像素值小于m的像素值全部设成value
src.setTo(value, src>m);	// src像素值大于m的像素值全部设成value
src.setTo(dst, src<m);		// src中的像素值当其值小于m的时候就将该值用dst中相应位置的值进行替换

3、copyTo()函数将一张图像复制到另一张图像上

1函数使用
函数原型1void copyTo( OutputArray m ) const;
举例image_in.copyTo(image_out);
解释把image_in这张图复制到image_out上

函数原型2void copyTo( OutputArray m, InputArray mask ) const;
举例image_in.copyTo(image_outmask);
解释image_in图像与掩膜mask进行逻辑与 &运算将运算后的图像复制到image_out上image_in对应mask中像素值为0的像素点都不会贴到image_out上

4、clone()函数克隆一个图像

1函数使用
Mat A  = Mat::ones(4,5,CV_32F);
Mat B = A.clone()	// clone() 是完全的深拷贝在内存中申请新的空间
Mat C;
A.copyTo(C);		// 此处的矩阵大小与大小不一致则申请新的内存空间并完成拷贝等同于clone()
Mat D = A.col(1);
A.col(0).copyTo(D)	// 此处D矩阵大小与A.col(0)大小一致因此不会申请空间而是直接进行拷贝相当于把A的第1列赋值给D

5、inRange()函数提取指定色彩范围区域用法是将一副彩色图像或者一副单通道图像转换为二值图像

  • inRange()函数输出的是一幅二值化之后的图像将阈值区间内的像素值设置为白色(255)不在阈值区间内的像素值设置为黑色(0)
  • inRange()函数应在hsv色彩空间下处理图像所以输入的图像需要先转化为hsv图像因为在RGB色彩空间下颜色值分布的太多太广我们很难准确的去提取选定区域的像素值但在hsv色彩空间下只有h和s这两个控制颜色很容易对颜色进行提取所以当你看到一个单一颜色的时候你想要寻找到它你的第一反应应该是将他转换到辨识度比较高的色彩空间下比如hsvhsilab等处理完之后再返回rgb就可以了
1函数原型
inRange(hsv, Scalar(hmin, smin, vmin), Scalar(hmax, smax, vmax), dst);
2参数解释
  • hsv输入要处理的图像可以为单通道或多通道图像先转化为hsv图像使用cvtColor()
  • Scalar(hmin, smin, vmin)下边界数组或标量输入hsv图像像素值小于此值设置为黑色(0)在区间范围内设为白色(255)
  • Scalar(hmax, smax, vmax)上边界数组或标量输入hsv图像像素值大于此值设置为黑色(0)在区间范围内设为白色(255)
  • dst输出图像与输入图像hsv 尺寸相同且为CV_8U 类型
3示例
  • 针对单通道图像一幅灰度图像的某个像素的灰度值在指定的高、低阈值范围之内则在dst图像中令该像素值为255否则令其为0这样就生成了一幅二值化的输出图像
  • 针对三通道图像每个通道的像素值都必须在规定的阈值范围内
  • Scalar(hmin, smin, vmin)Scalar(hmax, smax, vmax)里hsv值如何确定这里我的方法是先得到RGB再通过菜鸟教程工具来转化得到hsv确定我要提取图像的范围这样将范围填写进Scalar(h, s, v)就可以了
  • 将RGB输入到菜鸟工具后得到的hsv是小数我们将h乘以180s和v乘以255得到想要的Scalar(h, s, v)
比如将下图绿色区域提取出来

在这里插入图片描述

#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {
	// 读取图像BGR存储在Mat矩阵里
	Mat src = cv::imread("C:\\cpp\\image\\green.png");
	if (src.empty()) {
		printf("could not load image..../n");
		return -1;
	}
	namedWindow("src", WINDOW_NORMAL);
	namedWindow("hsv", WINDOW_NORMAL);
	namedWindow("dst", WINDOW_NORMAL);

	imshow("src", src);
	// 1、先转化为hsv图像
	Mat hsv;
	cvtColor(src, hsv, COLOR_BGR2HSV);
	imshow("hsv", hsv);
	// 2、再利用inRange()函数对图像二值化
	Mat dst;
	inRange(hsv, Scalar(45, 254, 204), Scalar(46, 255, 206), dst);
	imshow("dst", dst);

	waitKey();
	destroyAllWindows();
	return 0;
}

运行结果

在这里插入图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6