Pull to refresh

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),'  ((!.-'

Вы абсолютно правы! Мне тоже статья показалась лажей! И примитивом! В том и дело что символ должен корелировать с первоисточным изображением, максимально повторяя его! При том не вижу проблемы именно правильного решения, скажем побитного наложения каждого используемого символа для поиска символа с наибольшим сходством.

Опа, не знал об этом, сейчас прочитаю про это, спасибо!

Использование opencv для таких простых задач, по моему не оправдано, Есть же pillow.

Потому что неправильно были выставлены индексы, когда мы переводили пиксель в символ ASCII. Это пофиксилось кодом от пользователя Krasnoarmeec, читайте чуть выше в комментариях ↑

Как автор того самого комментария скажу, что недопонимание было вызвано странным форматом возвращаемого объекта gray_image = cv2.cvtColor, который, как и image.shape, является матрицей [строк, столбцов], т. е. [y, x], не смотря на то, что логичнее было бы сделать как раз наоборот.

Спасибо за вашу статью! Вы подали мне идею, при помощи которой удалось осуществить мою старую задумку о создании картинки из коллажа фотографий. Изначально, я хотел делать коллаж из цветных фото, но не смог сообразить как характеризовать преобладающий цвет на основе данных RGB, а с яркостью черно-белого изображения всё предельно ясно. Уверен, что готовые решения в сети должны быть, но хотелось написать код самому, чтобы порадовать жену её портретом составленным из фото сделанных за время нашей совместной жизни.

Ух ты!!! Какая интересная задумка, даже самому захотелось повторить)) Рад, что помог Вам своей статьей;))

Sign up to leave a comment.

Articles