我有一个像100万张图像的图书馆,其中大约一半是在同一地点用相同的半透明水印加水印。
我从哪里开始,用水印检测图像?是否有一些标准工具用于此目的?
答案 0 :(得分:3)
如果根据您的问题,您只想检测带水印的图像,可以使用以下算法:
代码可能是这样的:
$no_of_pixels = what_you_got;
$matched = 0;
$thumbpixels = array();
$wmark = imagecreatefrompng("watermark.png");
list($width, $height) = getimagesize("watermark.png");
$tesimage = imagecreatefrompng("test.png");
for($h = 0; $h < $height; $h++){
for($w = 0; $w < $width; $w++){
if(imagecolorsforindex($testimage, imagecolorat($testimage, $w, $h)) == $thumbpixels[0]){
while($thumbpixels[$i++] === imagecolorsforindex($tesimage, imagecolorat($wmark, $w, $h)) && $no_of_pixels != $matched){
$matched++;
}
if($matched == $no_of_pixels) echo "Voila, we found it!";
}
}
}
只是看到你的缩略图示例。如果您只想检测文字,可以尝试tesseract-ocr或PhpOCR。
您也可以考虑PHPSane
答案 1 :(得分:2)
检测图像中的几乎任何特征称为对象检测。有一种被广泛使用的库叫OpenCV。它有一个非常简单的SDK,虽然设置可能是一个真正的痛苦。它很好地支持C / C ++和(几乎支持) Python。我第一次开始使用OpenCV时花了3个星期的时间来训练自己的Classfier (training)。
但我不会完全依赖这个解决方案并考虑我的优先事项。而且,使用自定义分类器很难实现良好的速率。其他方法更耗时。
答案 2 :(得分:2)
简而言之,并非完全准确。
充其量,您只能在图像上应用启发式方法,看它是否与确切的水印相匹配,并获得置信度 - 例如,如果水印是50%白色叠加层,那么主要是白色的场景可以给出误报,当然反过来也是如此。
如果图像使用有损压缩(例如JPEG)作为边缘,并且饱和度可能导致水印不像预期的那样饱和,或者如预期那样精确定位,则也可能出现问题。
答案 3 :(得分:1)
因为您知道水印总是在哪里,所以您可以使用imagecolorat和imagecolorsforindex来获取水印内外像素的Alpha值。我希望在没有水印时alpha值相似,并且在存在时(在某个阈值内你需要确定)不同。当然,这可能不适用于所有图像,因此如果您需要100%的准确度,您可能需要更可靠的东西。
答案 4 :(得分:1)
在您的情况下,如果您在可预测的位置寻找相同的徽标,则相对简单。然而,在元数据中匹配版权声明会更加简单和快速(根据我在其他地方的评论)!
水印不会对内容产生固定的变化 - 每个修改过的像素将根据水印和图像本身获得新值。因此,你需要提取这些信息 - 我将分析图像,只看衍生物的大小(而不是相位)。
然后它只是correlating只有水印之一(或带有水印和其他内容的地段)的差异。
除非你很乐意编写自己的扩展,否则你真的不想在PHP中进行这种图像处理。大多数图像处理工具包都支持差异化和相关性。
顺便说一句:如果您不知道如何区分图像,和/或无法理解如何关联图像,请不要问 - 这不是讨论的正确论坛
答案 5 :(得分:0)
如果没有工具可以执行此操作,您可以尝试以下操作:
识别水印在像素百分比中的位置,例如右下角40px x 100px
对于每张图片,制作临时副本并裁剪出水印出现的位置。这应该使水印版本和非水印版本保持相同
比较图像 - 例如宽度x高度,文件大小,CRC或实际像素比较的组合,但对于一百万个图像,您需要一些严重的CPU功率。