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

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

Сообщение Anonymous »

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

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

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

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

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

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

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

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