//! copies those matrix elements to "m" that are marked with non-zero mask elements.
void copyTo( OutputArray m, InputArray mask ) const;
关注mask参数。要去掉水印的背景,需要使用mask,对不想修改的部分不做修改(上面的注释很清楚,就是说只对非0的位置做操作)。
那么如何构造这个mask?那么我需要对water_mark图像做二值化,生成一个黑白的mask,其中想留下的水印部分是非0(白色255),需要叠加操作;背景是0(黑色0),不需要叠加操作。
Mat gray(water_mark);
cvtColor(gray, gray, CV_RGB2GRAY);
再通过二值化函数 threshold 把灰度图 gray 转化为黑白图 mask,其中 最后一个参数 type 要看情况而定,我这里是 CV_THRESH_BINARY_INV,表明做一个反转。(如果不反转一下,嘿嘿,那就成了叠加背景和镂空水印了。)
Mat mask(gray);
cv::threshold(gray, mask, 128, 255, CV_THRESH_BINARY_INV);
效果图:
Mat color_mask;
std::vector planes;
split(water_mark, planes);
std::vector::iterator it = planes.begin();
for(; it != planes.end(); ++it)
{
mask.copyTo(*it);
}
merge(planes, color_mask);
cv::bitwise_and(water_mark, color_mask, water_mark);
addWeighted(roi, 1.0, water_mark, 0.5, 0, roi); //alpha add
效果图: