边缘检测之后再用模板匹配。你这个水印,边缘特征比较明显。如果水印大小、位置不变,那么特别好检测。如果大小不变,可以用一个搜索框搜索图片区域,计算边缘检测后的直方图,使用直方图相似性来匹配。
更进一步,水印是加在原始图像上,假设没有水印,那么当前水印边缘位置两侧的像素大部分应该是“相似”或“连续”的,由于加了固定的白色水印,导致不连续了。而这个不连续,可以用alpha混合的公式来计算。这样,你可以计算出每一个边缘点属于水印边缘的概率,如果一块区域里有大量的边缘点属于水印边缘的概率很高,那么这一块区域就是水印。
stroke width transform 是检测文字的。也可以用来辅助项。
总之,方法很多很多 弄图像识别,只会调用OpenCV的API是远远不够的。。。
做这些头脑要清晰,至于工具,都是次要的。抛开工具,咱们从数学角度谈谈。假设原始图像有个像素点的色彩为 (r,g,b),水印图片的颜色为 (wr,wg,wb),采用 alpha 混合,混合后的图像的像素点为(R,G,B),混合公式为
R = r * alpha + (1 - alpha) * wr
G = g * alpha + (1 - alpha) * wg
B = b * alpha + (1 - alpha) * wb
通过这张图片可以猜想 wr = wg = wb = 255。 要求的就是 alpha。 可以在图像中找到一个平缓的地方。正好水印覆盖一半的地方,分别在水印区域和非水印区域采样,因为平缓,可以认为两个样本在原始图像中的色彩一样,这样可以得到alpha。混合公式就有了。
下面就是检测:
对图像取Canny边缘,沿着边缘的法线方向在边缘内外分别取一个样本,检查这个样本满足上面公式的满足程度。如果相差很大,认为这个边缘是水印边缘的概率很小,如果差异很小,认为这个边缘有很大概率是水印边缘的边缘点。这样,对每个边缘点都把概率计算出来,设一个区域概率密度阈值,超过这个阈值就认为存在水印。