Comments 19
Цвет ещё не помешал бы, для цветной матричной печати.
Я когда-то игрался с таким, и обнаружил, что просто вычитание даёт достойный результат. Т.е. из блока изображения вычитал буковку, затем абсолютные значения всех пикселей разности складывал, и искал буковку, где результат наименьший.
У меня, к сожалению, нет под рукой тех картинок, но я не вижу качественного скачка в статье.
А если последнюю картинку с лицом инвертировать что получится?
Несмотря на матан, результирующие картинки выглядят, мягко говоря, не очень.
А причина простая: отсутствие хинтинга.
Так известный же термин — проще загуглить, что это такое.
Плюс ещё идеи из пиксель-арта: лучше рисовать то, что приятно глазу, а не то, что максимально точно соотвествует оригиналу.
https://habr.com/ru/post/241764/
https://habr.com/ru/post/247333/
Я делал проще: 1. Автоконтраст исходного, пока по чёрному/белому не будет по 3% гистограммы; 2. Усреднение Y в матрице 57, определение его попадания в 1 из 16 бинов; 3. Подстановка вместо блока 57 символа с визуальной плотностью, в среднем соответствующей бину. Таблицу плотностей символов рассчитал заранее и хранил в массиве
mplayer -vo caca -framedrop -quiet tv://
mplayer -vo aa -framedrop -quiet tv://
Если у вас нет веб-камеры или она заклеена, вместо «tv://» подставьте какой-нибудь видеофайл. Особенно эффектно смотрится в голой консоли. Ну или можно просто запустить так:
DISPLAY="" mplayer -vo caca -framedrop -quiet tv://
Собственно код который вычисляет похожесть участка изображения и пикселя в моем случае.
def sim(pixels1, pixels2):
b1 = pixels1.mean()
b2 = pixels2.mean()
return np.equal(pixels1, pixels2).mean() - abs(b1 - b2)
В pixels1 — бирнаризованный участок изображения в виде еденичек/ноликов. в pixels-2 бинаризованное представление символа
— Статистический. Плотность краски имитируется разными символвами, а само изображение надо рассматривать издалека. Для этого подхода матан не нужен: берем пиксель, в зависимости от его плотности (черноты) выбираем символ из соответствующей таблички, выводим.
— А-ля пиксель-арт: тут каждый символ важен, т.к. именно форма символа «рисует» картинку. Сами картинки, как правило, небольшие и нарисованы вручную.
Вот простенький алгоритмик, по которому можно получить текстовую картинку первым способом:
— грузим картинку в память.
— ресайзим ее, слегка сплющивая по вертикали, до нужной ширины — например, 80 пикселей. Сплющивать надо, т.к. символы текста не квадратные, а прямоугольные.
— Переводим в черно-белое изображение и выводим на экран, заменяя пиксели на символы в зависимости от черноты (я использовал списочек «на глаз» — "#WMH@OTI*+;:-,. ").
./ascii_art /mnt/seagate80/vault-boy.jpg
.-,
-@#MWWT,
,@#T, :@W+
.. .,:,,,,-*MW; +W@:.
,*HH, :@#HO@M####H, .*H#M@I:
.TWWW, ,@WT, ,*T+. .;IH#H,
,M@,MW, .+MT. :MH
HM. :M#HO@WO- ,HI
-#+ :+*;, ,W:
:#- -+;. -I@T- :W*.
,#: .*MOIOWT, .;TM#####I ;MW+
HT ;MO- .IMMWM@*;;*@##O. .T#T
T#W, .OM; .. ,T#@. I#I
;#@+H;. -IWT. ;W@,.-;I@HM@I, @#;
@W, ,TWWMH*, :T@OT+;;;*H##+ ,WW.
MM .HW: -IH- O##, I#O
TW..HM-.TT+:, :O* .##+ ,##,
,#IHW, ;O#O. ,##: H#+
*#W- :HO :MW; O#*
O#: . .O: *HWI. @#*
*#* -MW- .. IW* W#:
-#H H##T O+ .. :I-T@, -##.
@#: .W##+ .O@ ,@WW#WO- .IW:;M- T#H
:#@ O#O ,HM. ,;OW##W- ,.;M;:M, .W#+
O#; . ;WH, .IW#I +M+-M:+H I#M.
.WW. .T#H, ,O- -HO-H,H:-##+
:#@ ;M#O. .@;.@O;T*T@#@
I#T O##- :HT.H*OTW#W,
T#* .W#@ :-.O*,W;W##;
H#* :##I -M+ * ;H##I
H#* ,. ,-. -, :I ,O##T
@#O *W. -M; O#W,
T#H O#WHT;, -;T##@, M#@
+##. ;#T.,;IOOOI*++ITOHH@O*;;@#W; I#W.
-##+ O@TO: ,-:::-, -O##* H#H
M#H ., -OMI- .:I@MI-TW. *##:
*##; ,IMWM@TTTT@MW@*- I+ -@##;
M#M. -*T@@OI+- . +OTOM##O-
:##O ;I***: .T##@II;,
I##* ;OHH* -H#W+
T##I IW#O.
*##T. +M#W;
;IIITTTTH##M: .*M##OMH*,
;******+++H##T. :OW#M#T -IMH*,
I@HHHHHHI MM*@WT- -I+:,@M. ;##@;.
O#######+;#: ,*#H*, ,@H, +#*;HMI,
O#######:IW I###MT+:-.. -TWO. .MW,+;-IW@:
O#######-IW. I####HOTI+, .:IH#H: O#I-##MI-*WH;
O#######;+#: -O###M@OOOHM##MT- T#H,H####WI-*WH;
*OOOOOOO*.O* .;IOOOOOOI;, +OT.;OOOOOOOT:.*O*.
WW################MHHMMHHHHHHMMMWWWMMMWMWMMHMHHMHMMHMWWWWWWWWWWWWWWWWW#########
################WM@@HMMMWWMMH@HH@HHWMMWW#WWMMHHH@@HHMMMMMMMMMWWWWWWWW##########
###############MHHHMMMMMMMMH@HO@H@@MMHWWMHHMMMMMHHHMMMMMHHMMMMMWW##############
#############M@HMHMMMWM@TTTTTTIIT@HHHHMHOTTTTO@HH@@HMHMMMHMMMMMWW##############
##########WH@@HHHHHMMOITTTOOOOOIIOHH@@@HMMHH@OOOTTOOHHHMMHHHHHMMWW#############
##########HHHHHMMMM@IITO@HHHMMMMOITHMOMWWWWWWM@@@O@HHHHMMMMHMMMMMWW############
#########M@@HMMMMHTIOOTIIIO@@HMMMOTOMHMWWWWM@O@@H@@HHHMMMMMMMMMMMWWW###########
########M@@@HHHMHOTOOOOOTO@HHMHMH@@@MMHMWM@T@MWMMM@O@HHMMMMMMMMMMMWW##########M
######WH@@HHMMMM@OOOOTTTTOOHHMMMM@@MMM@H@OO@@@@OOOO@O@OHMMMMWMMMMWMWMM########W
#####WH@@HHHMMMHTOOO@@HHHHHO@MMMH@@MM@@@OTTTOTTTO@OO@@O@HMMMMMMMMMMMMMHW#######
####WHHHHHHMMMHO@O@MWWMM@MMMH@HMHHHH@HHMHHH@OOOO@HMHHMMMHHHMMMMWWMMMMHHMM######
WW#WHHHHHMMHMHO@@HWWWMMMHHMH@@HMMMHMMMWMMMHHH@@HHHHH@HHMMHHHMMWWWMWMMM@HWM#####
W#WMHHHHMMHH@@OHWWWMHMMMMMM@TOHMHHMHHHHHHHHH@@OOOOO@@@HHHMMMMMWWMWWWWMHH@WWW###
WWWHHMMHHMMHMHHWMMH@@HMMMMM@T@HHHHHOOO@@HHHHH@TIIIO@@@@WWMMMMMMHMMWWWWMMHHM#W##
MMHHMMMHHMMMMHMMMMHHHHMMMMH@O@@H@@OOTO@@HHHHH@O@TTTOOOIHMMWWMMMMHHMWWWWMMHM#WM#
MHHHMMMWMMMMMMMMMH@@HHMMHH@OO@OTIITTI*ITI*+IITOO@TTTOOOO@HMMMWMMMHHMMMMMWMMW#M#
WHHMMWWWWMMMMMMMMM@@HHH@OOTITT*+;;++;++;;;;;+**TTOOIOO@@@@HHMMMWWM@@MMMMMWWW#W#
WH@HMMMMMMMMMMMMWMHH@OTII*++++;::::;:::::::::;+*ITT@I@HHHHH@HMMWMH@@HMMMWWWW#WW
MH@HHMMMMHHHHHMMH@OTI***+;;++::::--::----::::::;*ITT*@HHHHH@@@HMMMH@@MWWWWWMWWW
MO@HHMMMMH@@@@@@OTI****++;;++;:::----:---::::::;+*TIIT@@@HH@@OOHHMHH@HMWWWWMMMW
M@O@HHMHHH@@@@OOTII****+++;;+;;:::-----:::::::;;+*IT*T@@OT@@@OOOO@@@@@HMWWWWMMW
M@@@@HHHHHHH@@OTTIII****+++;+;;::::::::::::::;;;*+ITTTO@TOOO@O@OTOO@HHMMWWWWWWW
HOOO@@HHHHH@@@OOTII****++++;;;:::::::::::::::::;+**TOOO@TTOO@@@@@OOO@HHMMMWWWWW
MOO@@HHHHHH@@@OOTII****+++++;::::::::::::::::::;;**IOOOOTTO@@@@@@@@@@HMMMWWWWWW
M@O@@@@@@@@@@@@OTTIII***+++++;;::::::::;::::;;;;+**ITOOTTTO@@@@H@@@HHMMMMWWMWWW
WH@O@@@@@@@@@@@OTTII***+++;;;;;::::::::;:::::;;;;;+++*IIITOO@@@HH@HHHMMMMMMWWWW
WMMOO@@@@@HH@@OOTTII****++++;;:::;;:;;;;::::;;;;++++++*IITO@@@@@HHHHHHHMMMMWWWW
WWMOT@@HHHH@O@@OTTI****+++;;;::::;;:;:;:::::;;;;++++++**ITOO@@@@HHMMMMMMWMWWWWW
WWMHTO@H@@OOO@@TTIII*+++++++;;;;;;::;;;::;;;;;+++++++*IIITT@@@O@HHMMMMMMMWWWWWW
WWMHOOOOOO@O@HOTTTTTTIII*I*I*+;;;;;;;;+;;;++*ITOOTTTTTTOOO@@@@O@@HHMMMWWWWWWWWW
WWMH@@O@@@@@@@IIOOOOOOOOO@HHH@OII*+++++***ITO@MMMHMHHHH@@HHHH@O@@@HHMWWWWWMMWWW
WWWWMH@@HH@O@@IIO@OTTOOOO@@HHH@@OTI*+++*IO@HMWWWMWW#WMWM@HHHH@OO@HH@HWWWWWMMMWW
WWWWWMH@@H@O@OIITOOO@MM@@W#W@T@@@@O*;;+*THHMHOT+*@WMO*I@@@@@TOOO@HH@HW#MWWWMMMW
WWWWWWMHOOOOOOIITOOO@@T**OH@*:+*ITTI;;;*TO@**I*++*IIII*IIIIIIITO@HHHM#WMHMWWMMM
MWWMMWH@OTTOOOIIIITTI***+*++++++++T*;:;+TTO*++**+;;+++*III****TO@HMMW#WMHWWMMMM
WMMMHMH@TTOTTOI**+***++++++;+++++*I*+::+ITII*++*+++++***I*++**IO@MMMWMMMHWWWMMW
WWMH@OOOTTTTTOI**++++++++;;;+++++*I*;::;IT*+*+**+++;+++*++++**TOHMMWWMW@HWMMMMW
WWWMHHH@@TITOOI***+++++++++;;+;+**I*;::;IT*++++++;;+;;;++++**IT@MMMWWWH@WWMMHM#
WWWWWH@@@OIITTT*****+++;;+;;;;;+**I*;::;*TI++**++++++++****IITOHMMMWMHHW##MMHW#
WWWW#WH@H@O*ITOIIII***+++++;;++*III+;::;*TIII*++++++++**IITTTOHHMMW#MMW#WWMMM##
WWWW##WHHHH@TOOIIIIII**++++;+++*II*+;::;IIIITI*++*+++**IITTTOHHMMW#####WWWWW###
WWWW##WH@@@O@@OTTTTTII*+++++;;;+II*+;::;+*TTTT*+++++**IITOO@@HHMMW####WWWW#####
WW#####M@@@OO@HTTTTTTI*++++++++ITT*+;::;+*OTTOI**++***ITTO@@@HHHH####WWW#######
#######W@@@OOOHOTTOTOTI**+++**ITII*+;::;+IO**TTII*****ITOO@O@HHHM####WWW#######
########MMH@@@H@ITTTTTTI****IT*+*I*+:-:;+*II*IO*ITIIIITTOOO@@HHHW######W#######
#########WMHHMMHTTTTTTTII*IIT*;IIII+;::;+ITOT@MI++ITIITOO@OO@@HM###############
#########WWWMMMMOTTIIITTIITI+;;+@HOT*+**IOHMWW@*+++*TTOOO@O@HHMM###############
############WMMW@OTTIITIIT*++++++@MMH@@@M###MO***I***ITOO@O@HHHW###############
##########WWWMM#WOTTTIIIII*****I*TT@W#####MHTTTITOTTTITTIO@@HHMW############WWW
##########MMMW###MOTIIIIIIIIOOOITTOTO@MMH@TOO@@@@@@@@OTOIO@HMMW#############WWM
##########WWW#####@TTTIIIITO@HOTOOTITOOTOOOTTO@@MWMHHOIOIOHHMMW################
##################MTTTTTIT@H@@@@@O@OOOTIITO@@HMMMH@TOII@OOHMMW#################
###################@TTTTIO@TIII**I***ITTOTOTOOTOTITITII@OO@M###################
###################WOITOITT*IIII**+;;;;;++***TOOOTII*TOH@HMW###################
####################@T*TTIIIIITTTTI******IITOO@@OTTITOMH@MW####################
###################WHOI*TI*IIIITOO@O@@@@@HHHHH@OTIITOHH@MW#####################
###################WH@OTITI*I**IITTT@@@@H@@@@OII*IIIT@@MW######WW##############
###################WHHHH@TI*+**+*****ITTIII*I****I*T@HW########WW##############
####################MHHMWHTI***++++***I********IITTOHW#######WWM###############
####################WHHMW#MOI****III**IIIII**ITIIT@M#######WWMM################
#####################MHMHM##HTTITTOOTTTTTOOTTITOTH########WMMMW################
#####################MHMHHHM##H@OO@@HHHHMH@@OO@MW#######WMMMMW#################
######################HMMH@@H###WWMMWWWW##WWWW#########WWMHHW##################
На Путина похож.
Преобразование черно-белых изображений в ASCII-графику при помощи неотрицательного матричного разложения