Определите, является ли изображение "чистой" бумагой
Мы создаем инструмент, который позволит сделать цепочку фотографий. С реальными фотографиями будут добавлены фотографии чистых листов бумаги. Я хочу разделить серию фотографий, идентифицируя изображения пустых страниц.
Я пытаюсь найти способ идентифицировать чистый лист. Либо путем подсчета цветов, либо каким-либо другим методом. Может быть, размер файла?
У меня есть GraphicsMagick, так что, возможно, там есть что-то полезное, и код будет на PHP, но может быть во всем, если он будет работать хорошо.
3 ответа
Вы можете справиться с количеством цветов, но я немного обеспокоен тем, что это хорошо работает - хотя без большего количества образцов изображения трудно сказать. Поэтому, если у вас возникнут трудности с этим, вы можете посмотреть на гистограммы двух пунктов - бумаги и "не бумаги".
Бумага
Не бумага
Вы можете видеть, что бумажная гистограмма имеет очень крутые стороны и никаких хвостов, в то время как гистограмма "не бумаги" имеет более толстые хвосты. Куртоз изображения является мерой именно этого - упитанность хвостов. Более высокий эксцесс означает, что большая разница в изображении является результатом нечастых крайних отклонений, в отличие от частых отклонений небольшого размера. Таким образом, вы ожидаете, что у "не бумаги" будет более высокий эксцесс, потому что на нем есть "комки" других материалов, а не довольно однородной бумаги.
Если вы получите ImageMagick, чтобы сообщить о эксцессах двух изображений, вы увидите заметную разницу.
identify -verbose notpaper.jpg | grep -E "kurtosis:|Red:|Green:|Blue:|Overall"
Red:
kurtosis: 1.03434
Green:
kurtosis: 1.22576
Blue:
kurtosis: 0.593927
Overall:
kurtosis: 1.49035
И для бумаги...
identify -verbose paper.jpg | grep -E "kurtosis:|Red:|Green:|Blue:|Overall"
Red:
kurtosis: -0.953723
Green:
kurtosis: -0.980636
Blue:
kurtosis: -1.06634
Overall:
kurtosis: -0.0151458
Как я уже сказал, вы можете справиться с количеством цветов, но, возможно, подумайте об этом, если у вас возникнут проблемы.
gm identify IMG_0551.JPG -format %k
все, что <10k, скорее всего, чистый лист.
Попробуй использовать imagecolorat
Здесь ссылка
<?php
$im = imagecreatefrompng("php.png");
$rgb = imagecolorat($im, 10, 15);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
var_dump($r, $g, $b);
?>
или это
<?php
$im = imagecreatefrompng("php.png");
$rgb = imagecolorat($im, 10, 15);
$colors = imagecolorsforindex($im, $rgb);
var_dump($colors);
?>
это будет о / п, как это
array(4) {
["red"]=>
int(119)
["green"]=>
int(123)
["blue"]=>
int(180)
["alpha"]=>
int(127)
}
проверьте значение белого и сравните. Если все значения 255, 255,255, то это белая бумага.