У меня есть библиотека, похожая на 1 миллион изображений, и примерно половина из них отмечена водяным знаком с тем же полупрозрачным водяным знаком в том же месте.
С чего начать, обнаруживая изображения с водяными знаками? Существуют ли для этого стандартные инструменты?
Если в соответствии с вашим вопросом вы просто хотите обнаружить изображения с водяными знаками, вы можете использовать следующий алгоритм:
Код может быть примерно таким:
$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
Обнаружение почти любой функции изображения называется Обнаружением объекта . Существует широко распространенный libray под названием OpenCV . У него очень простой SDK, хотя настройка может быть настоящей болью. Он хорошо поддерживается для C / C ++ и (почти хорошо поддерживается) Python. Мне потребовалось 3 недели, чтобы обучить мой собственный Classfier (обучение) , в первый раз я начал использовать OpenCV.
Но я бы не стал полностью зависеть от этого решения и рассмотрел мои приоритеты. Кроме того, очень сложно добиться хорошей скорости с помощью специализированного классификатора. Другие методы занимают больше времени.
Короче говоря, не с полной точностью.
В лучшем случае вы можете применять эвристику на изображении только для того, чтобы увидеть, совпадает ли он с точным водяным знаком и получить рейтинг доверия – например, если водяной знак, если наложение 50% белого цвета, тогда сцена, которая была преимущественно белой, могла дать ложным положительным, и, конечно, обратное верно.
Существуют также проблемы, которые могут возникнуть, если изображения используют сжатие с потерями, такое как JPEG, в качестве краев, а насыщение может привести к водяному знаку, который не настолько насыщен, как ожидалось, или точно точно соответствует ожидаемому.
Поскольку вы знаете, где всегда есть водяной знак, вы можете использовать imagecolorat и imagecolorsforindex, чтобы получить значение альфа для пикселей как внутри, так и снаружи водяного знака. Я ожидал бы, что значения альфа будут одинаковыми, когда нет водяного знака, и разные, если есть (в пределах какого-то порога, который вам нужно будет определить). Конечно, это может не работать на всех изображениях, поэтому, если вам нужна 100-процентная точность, вам, вероятно, понадобится что-то более надежное.
В вашем случае, когда вы ищете один и тот же логотип в предсказуемом месте, это относительно просто. Однако гораздо проще и быстрее (согласно моему комментарию в другом месте) сопоставить уведомление об авторских правах в метаданных!
Водяной знак не будет производить фиксированные изменения в содержимом – каждый модифицированный пиксель получит новое значение на основе водяного знака и самого изображения. Следовательно, вам нужно извлечь эту информацию – я бы пошел с дифференцированием изображения и просто посмотрел на величину производной (а не на фазу).
Тогда это просто вопрос о соотношении дифференциала с одним из водяного знака (или большим количеством с водяным знаком и другим контентом).
Вы действительно не хотите заниматься подобной обработкой изображений на PHP, если не хотите писать свои собственные расширения. Большинство инструментов обработки изображений будут поддерживать дифференциацию и корреляцию.
BTW: если вы не знаете, как отличить изображение, и / или не можете понять, как соотнести образ, пожалуйста, не спрашивайте – это не правильный форум для этой дискуссии
Ну, если нет инструмента для этого, вы можете попробовать следующее:
определить, где водяной знак отображается в процентах от пикселей, например, нижний правый 40 пикселей x 100 пикселей
Для каждого изображения сделайте временную копию и обведите место, где будет отображаться водяной знак. Это должно оставить как версию с водяным знаком, так и версию без водяных знаков
сравните изображения – например, сочетание ширины x высоты, размер файла, CRC или фактического сравнения пикселей, хотя для миллиона изображений вам потребуется какая-то серьезная мощность процессора.