Comments 18
Миленько. Статья коротковата, конечно. Надо было сразу сюда bad apple закинуть с ютуба, сложностей не вижу.
Для студенческого или школьного проекта вполне норм
Статья супер!
Только меня что-то терзают смутные сомненья... Кажется (Python это не тот язык, на котором я пишу каждый день), что индексы в `gray_image[x, y]` перепутаны местами. Если переписать Ваш код в следующем виде:
with open("output\ASCII_Art.txt", "w") as file:
for y in range(0, height - 1, 8):
s = ""
for x in range(0, width - 1, 4):
s += string[len(string) - int(gray_image[y, x] / coef) - 1]
if len(s) != 0:
file.write(s + "\n")
то обработка исключений не понадобится.
Я согласен с тем, что они перепутаны местами, но если прописать как Вы, то картинка будет перевернутой и придется транспонировать матрицу пикселей перед началом перевода в ASCII-символы. А так как в этом коде есть первые шаги перед bad apple, который выводиться в консоль, то нам надо максимально уменьшить время обработки кадра, которое увеличивает транспонирование матрицы. Поэтому строчка получилась не особо верной, но быстро работающей :))
Дам своему школьнику статью, поглядим, что будет :)
Способ любопытный, но я бы не назвал это ascii-артом: это просто наложенный на картинку фильтр. Точно так же, как фотография, сжатая в фотошопе до размера 32x32, не становится пиксель-артом.
Ну так да, ASCII-арт - это и есть фильтр, как и пиксель-арт, просто что это иначе будет? И главный смысл то в том, чтобы постараться сохранить изображение понятным, а то в Вашем примере сжатая картинка вряд ли останется читаемой...
При таком подходе от символа используется только его средняя яркость, и смысла в этом, по большому счету, никакого. Просто по яркости пикселей выбираются символы из отсортированного списка. ASCII есть, а art'а нет.
Можно, например, анализировать символ детальнее - разбить на четыре или более субпикселя. Или вообще напрямую считать корреляцию между символом as is и участком изображения. Можно наоборот, к картинке применить edge detection и выбирать символы в соответствии с направлениями контуров. Всё это должно поднять разрешение и увеличить выразительность картинки.
("`-''-/").___..--''"`-._
`6_ 6 ) `-. ( ).`-.__.`)
(_Y_.)' ._ ) `._ `. ``-..-'
_..`--'_..-_/ /--'_.' ,'
(il),-'' (li),' ((!.-'
Вы абсолютно правы! Мне тоже статья показалась лажей! И примитивом! В том и дело что символ должен корелировать с первоисточным изображением, максимально повторяя его! При том не вижу проблемы именно правильного решения, скажем побитного наложения каждого используемого символа для поиска символа с наибольшим сходством.
Вы переизобрели aalib / libcaca
Использование opencv для таких простых задач, по моему не оправдано, Есть же pillow.
Неплохо! А почему ошибка вылезала с индексами?
Потому что неправильно были выставлены индексы, когда мы переводили пиксель в символ ASCII. Это пофиксилось кодом от пользователя Krasnoarmeec, читайте чуть выше в комментариях ↑
Как автор того самого комментария скажу, что недопонимание было вызвано странным форматом возвращаемого объекта gray_image = cv2.cvtColor, который, как и image.shape, является матрицей [строк, столбцов], т. е. [y, x], не смотря на то, что логичнее было бы сделать как раз наоборот.
Спасибо за вашу статью! Вы подали мне идею, при помощи которой удалось осуществить мою старую задумку о создании картинки из коллажа фотографий. Изначально, я хотел делать коллаж из цветных фото, но не смог сообразить как характеризовать преобладающий цвет на основе данных RGB, а с яркостью черно-белого изображения всё предельно ясно. Уверен, что готовые решения в сети должны быть, но хотелось написать код самому, чтобы порадовать жену её портретом составленным из фото сделанных за время нашей совместной жизни.
ASCII-арты на python