在opencv中,我们提取指定色彩范围的区域,采用inRange实现,这样的一块区域,学名叫做ROI(region of interest),感兴趣区域。
关于inRange的提取原理
图像中,对于在指定色彩范围内的颜色,将置为255(白色),不在的则置为0(黑色)
对于多通道的输入,输出结果是各个通道的结果相与,当各通道结果都在上下限之内时,输出为255,否则为0。
因此也有人将输出理解为mask掩码模板,作为mask使用。将位于颜色在图像上下界当中就可以将颜色单独提取出来,设为白色,不在的设为黑色
inRange提取指定色彩范围内的区域共4个参数第1个参数 输入第2个参数 色彩下界第3个参数 色彩上界第4个参数 输出
说明:
HSV色彩空间
HSV相较于BGR色彩空间,颜色的区分度比较明显,对某个颜色来说可以很容易的提取出来。
更换图像背景,这里利用到了重载的copyTo
当我们传入mask时,这里的copyTo只会拷贝到mask中不为0的像素点,即白色区域(255)
白色区域为背景色重载
inRange
提取后,指定色彩区域为255,roi区域为0。
为了利用copyto,我们需要对提取后的图像进行非操作,这样roi区域就会变为255。
copyTo重载的拷贝共2个参数第1个参数 输出第2个参数 输入
配合copy使用,用一个取反操作变白即可
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);}
上一篇:Java-日期类,正则实验
下一篇:Python检测和防御DOS攻击