12 图像色彩空间转换 - 进阶
opencv
知识点:
- 色彩空间转换 -
cvtColor()
- 提取指定色彩范围区域 -
inRange()
- 更换图像背景 -
copyTo
的mask
用法
本课所解决的问题:
- 如何提取指定色彩范围的区域?
- 如何更换图像的背景?
1.HSV色彩空间
HSV相较于BGR色彩空间,颜色的区分度比较明显,对某个颜色来说可以很容易的提取出来。
2.提取指定色彩范围区域
在opencv中,我们提取指定色彩范围的区域,采用inRange
实现,这样的一块区域,学名叫做ROI(region of interest),感兴趣区域。
关于inRange的提取原理
图像中,
对于在指定色彩范围内的颜色,将置为255(白色)
,不在的则置为0(黑色)
对于多通道的输入,输出结果是各个通道的结果相与,当各通道结果都在上下限之内时,输出为255,否则为0。
因此也有人将输出理解为mask掩码模板,作为mask使用。
inRange
提取指定色彩范围内的区域
共4个参数
第1个参数 输入
第2个参数 色彩下界
第3个参数 色彩上界
第4个参数 输出
程序:
//函数定义
void inrange_demo(Mat& image); // .h文件
//函数实现
void QuickDemo::inrange_demo(Mat& image) { // .cpp
Mat dst;
cvtColor(image, dst, COLOR_BGR2HSV);
/*
为了提取指定色彩范围内的区域,我们先把图像转换为HSV色彩空间
*/
Mat mask;
inRange(dst, Scalar(100, 43, 46), Scalar(124, 255, 255), mask);
imshow("提取", mask);
}
3.更换图像背景
更换图像背景,这里利用到了重载的copyTo
copyTo
重载的拷贝
共2个参数
第1个参数 输出
第2个参数 输入
当我们传入mask时,这里的copyTo只会拷贝到mask中不为0的像素点,即白色区域(255)
inRange
提取后,指定色彩区域为255,roi区域为0。
为了利用copyto,我们需要对提取后的图像进行非操作,这样roi区域就会变为255。
程序:
void QuickDemo::inrange_demo(Mat& image) {
Mat dst;
cvtColor(image, dst, COLOR_BGR2HSV);
Mat mask;
inRange(dst, Scalar(100, 43, 46), Scalar(124, 255, 255), mask);
imshow("提取", mask);
Mat greenback = Mat::zeros(image.size(), image.type());
greenback = Scalar(40, 200, 40);
bitwise_not(mask, mask);
imshow("非", mask);
image.copyTo(greenback, mask);
/*
mask剩下的黑色区域,由greenback填充
*/
imshow("绿色", greenback);
}
本课所用API查阅
cvtColor()
img *= 1./255;
cvtColor(img, img, COLOR_BGR2Luv);