Самый простой способ получить точную оценку — получить ограничивающую рамку треугольника, а затем перебрать каждую строку, сохраняя подсчет количества цветных пикселей и общих сумм каждого канала, а затем деление в конце. (Это также дает вам возможность предварительно вычислить суммы отдельных строк, что полезно, если вам нужно вычислить очень большое количество треугольников 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
Мобильная версия