Получить средний цвет треугольника, наложенного на растровое изображениеPython

Программы на Python
Ответить
Anonymous
 Получить средний цвет треугольника, наложенного на растровое изображение

Сообщение Anonymous »

Предположим, у меня есть растровое изображение RGB I. Я хочу получить средний цвет нескольких случайных треугольников с вершинами A, B и C. A, B и C гарантированно находятся в пределах изображения I, но не гарантируется быть целочисленными значениями. Как эффективно получить средний цвет области?
Самый простой способ получить точную оценку — получить ограничивающую рамку треугольника, а затем перебрать каждую строку, сохраняя подсчет количества цветных пикселей и общих сумм каждого канала, а затем деление в конце. (Это также дает вам возможность предварительно вычислить суммы отдельных строк, что полезно, если вам нужно вычислить очень большое количество треугольников T.) Однако это наиболее точно для очень больших треугольников; чем меньше треугольники и чем меньше наименьший угол в треугольнике, тем больше проблем мы сталкиваемся с заниженными или завышенными пикселями, которые находятся лишь частично внутри треугольника.
Меньше простой способ — взять ту же самую ограничивающую рамку; затем для каждого пикселя в ограничивающей рамке вычислите площадь каждого пикселя, который также содержится в треугольнике; затем добавьте к промежуточной сумме площадь пикселя и средний цвет, умноженный на площадь пикселя. Однако это непрактично медленно.
Хотя я специально ищу Pythonic-ответы и библиотеки, в которых могут быть способы их реализации, около 90 % этого будет поиск правильного алгоритма, 10 % будет его реализовывать.
РЕДАКТИРОВАТЬ: Вот иллюстрация некоторых вырожденных случаев, включающих маленькие треугольники, очень близкие к ярким границам, чтобы проиллюстрировать проблемы с простыми методами.
Изображение

Для иллюстрации я создал изображение, в котором используются только два цвета: пурпурный и синий, на поле высотой 6 пикселей и шириной 16 пикселей.
Если мы просто посчитаем пиксели, центр которых точки находятся в треугольнике, площадь треугольника A равна 10 (8 пурпурных, 4 синих), площадь треугольника B равна 2 (2 пурпурных), а площадь треугольника C равна 4 (3 пурпурных, 1 синяя). очевидно, это неверная оценка как общей площади каждого треугольника, так и соотношения пурпурного и синего цветов в каждом треугольнике. Если мы считаем любую часть пикселя находящейся «внутри» треугольника, треугольник A имеет площадь. из 19 (10 пурпурных пикселей и 9 синих пикселей), треугольник B имеет площадь 8 (4 пурпурных пикселя и 4 синих пикселя), а треугольник C также имеет площадь 8 (4 пурпурных пикселя и 4 синих пикселя), несмотря на треугольники. B и C имеют одинаковую «площадь» при подсчете всех пикселей, частично обрезанных треугольником, пропорции их площадей заметно различны и не должны иметь одинаковый средний цвет.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ver-bitmap
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»