| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > Автоматическая обрезка графики |
| Автор: offline 3.2.2011, 18:22 |
| Есть следующая задача. Сканирую какой либо объект на сканере, например 10 рублей при этом их накрываю белым листом бумаги. Получаю изображение 10 рублей на белом фоне. Задача следующая, как автоматически вырезать 10 рублей (прямоугольником) из этой картинки, т.е. нужно просто вырезать изображение при этом откинуть пустые белые края. Подскажите, есть ли готовые алгоритмы или как это можно реализовать??? Заранее спасибо. |
| Автор: Bitter 5.2.2011, 16:30 |
| Нужно накрыть не белым листом, а, например - зелёным, как делают при съемках погоды. А после этого удалить все зелёные пиксели с некоторым допущением. В общем надо накрыть таким цветом, которого нет на купюре. |
| Автор: DreamBit 20.2.2011, 21:39 |
| Сравниваешь каждый пиксел изображение, то есть RGB скажем скока примерно должно быть красного, зеленого, синего соответственно (диапазон) Как то делал подобное приходилось в редакторе подбирать эти составляющие. |
| Автор: DimaDD 29.11.2011, 04:00 |
| В общем, примерно такая идея в голову пришла, если объект только один. Сначала надо учесть, что сканер "шумит" и поэтому белый фон будет из пикселов несколько разного цвета. Т.е. сравнение цветов заключается в проверке, попадают ли они в некоторый настраиваемый(?) диапазон по RGB каналам. Сама процедура может заключаться в оконтуривании объекта. Сначала можно предположить, что объект, скорее всего, лежит примерно в центре скана. Начинаем сканировать (просматривать пикселы) в средней строке, пока не дойдём до не-фонового цвета. Если не нашли, то сканируем с некоторым шагом в двух направлениях попеременно - вверх и вниз, пока не дойдём до границы некоторого объекта. Шаг - скажем, 10 строк, а лучше заранее примерно оценить размер объекта, ежели сканируется примерно одно и то же, и взять минимальное возможное измерение как константу. Дошли до границы - поставили пока что Xmin=Xmax, Ymin=Ymax области (а также Xstart и Ystart), после этого начинаем оконтуривать: проверяем окружающие пикселы по час. стрелке (скажем), начиная с Xmin-1 (это был ещё цвет фона). Переходим на первый встреченный не-фоновый пиксел и сравниваем его координаты с Xmin, Xmax, Ymin и Ymax, заменяя нужные предельные значения. Снова проверяем окружающие пикселы по час. стрелке, начав с последнего не-фонового на прошлом шаге. И так далее, пока не вернёмся к Xstart, Ystart. Смотрим полученные Xmax-Xmin и Ymax-Ymin: ежели они совсем небольшие, то это, наверное, просто мусор на стекле сканера Раньше или позже встретится объект достаточно большого размера, он будет заключён в прямоугольную область Xmin, Ymin, Xmax, Ymax. При желании можно и сохранить координаты всех достаточно больших областей, просканировав так всё изображение. Т.е. найти и 10-рублёвку, и несколько монеток заодно! Это только в первом приближении, там ещё м.б. какие-нибудь подводные камни, которые сразу в голову не пришли... |