Intereting Posts
PHP Предупреждение: mysqli_stmt :: bind_param (): Число переменных не соответствует количеству параметров в подготовленном сообщении Случайный взвешенный выбор события используйте некоторое время mysql_fetch_array и UPDATE во время цикла API URL-адресов URL-адресов API возвращает ipRefererBlocked Как отсортировать многомерный массив с помощью определенного ключа? вставить в строку запроса более 100 переменных Получение значения переменной из PHP с помощью jQuery использование включает кросс-домен, содержащий php-код – сбой Как извлечь текст из текстового файла .doc, docx, .xlsx, .pptx php Использование PHP для удаления выбранного элемента из раскрывающегося списка, среди прочих Как переопределить не подключаемую функцию родительской темы из файла non function.php? Чтение электронной почты через IMAP в PHP Вставка персидского текста в таблицу mysql CakePHP 3 – Как использовать Trim () перед проверкой NotEmpty? BadMethodCallException с сообщением «Вызов неопределенного метода Illuminate \ Database \ Query \ Builder :: belongsToMany () '

PHP, обнаружение водяных знаков?

У меня есть библиотека, похожая на 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: если вы не знаете, как отличить изображение, и / или не можете понять, как соотнести образ, пожалуйста, не спрашивайте – это не правильный форум для этой дискуссии

Ну, если нет инструмента для этого, вы можете попробовать следующее:

  1. определить, где водяной знак отображается в процентах от пикселей, например, нижний правый 40 пикселей x 100 пикселей

  2. Для каждого изображения сделайте временную копию и обведите место, где будет отображаться водяной знак. Это должно оставить как версию с водяным знаком, так и версию без водяных знаков

  3. сравните изображения – например, сочетание ширины x высоты, размер файла, CRC или фактического сравнения пикселей, хотя для миллиона изображений вам потребуется какая-то серьезная мощность процессора.