這還是比較有意思的淮蜈,純JAVA不用opencv就能實(shí)現(xiàn)斋攀。
前兩天在百度貼吧里面看到有種字符組成的圖片,遠(yuǎn)看像模像樣近看一堆亂碼梧田,還有g(shù)if和視頻的版本淳蔼,其實(shí)不難實(shí)現(xiàn),下面分享一下實(shí)現(xiàn)過(guò)程裁眯。
0.方法概述
一句話(huà)鹉梨,就是將圖片不同部位的亮度或RGB值用相應(yīng)亮度的字符重新繪制出來(lái)。
程序運(yùn)行步驟概括為:
1.字符集的亮度計(jì)算
2.圖片分塊計(jì)算亮度值穿稳,并替換成亮度所映射的字符
3.寫(xiě)出到硬盤(pán)
1.字符集選擇及計(jì)算方法
字符集的選擇很重要存皂,盡量滿(mǎn)足:
1.亮度分布均勻,盡量從0-255都有對(duì)應(yīng)亮度的字符逢艘,
2.某一亮度對(duì)應(yīng)的字符越多越好旦袋。
至于為什么要求這兩點(diǎn)后面再說(shuō),先放三個(gè)字符集樣例和亮度分布直方圖給大家看看:
字符集A:
ABCDEFGHIJKLMNOPQRSTUVWXYZ⊙①⊕Θ⊙¤㊣♀⊿? ▂ ▃ ▄ ▅ ▆ ▇ █ █ ■ ▓ 回 □ 〓≡ ╝╚╔ ╗╬ ═ ╓ ╩ ┠ ┨┯ ┷┏ ┓┗ ┛┳⊥﹃﹄┌ ┐└ ┘∟「」↑↓→←♀♂┇┅ ﹉﹊﹍﹎╭ ╮╰ ╯ *^_^* ^*^ ^-^ ^_^ ^︵^ ∵∴‖︱ ︳︴﹏﹋﹌︵︶︹︺ 【】〖〗@﹕﹗/ \" _ < > `,·它改“淘校≈{}~ ~() _ -『』√ $ @ * & # ※ 卐 々∞Ψ ∪∩∈∏ の ℡ ぁ §∮〝〞ミ灬ξ№∑⌒ξζω*ㄨ ≮≯ +-×÷﹢﹣±/=∫∮∝ ∞ ∧∨ ∑ ∏ ∥∠ ≌ ∽ ≦ ≧ ≒﹤﹥じveve↑↓⊙■♀『』Ψ ※? →№←㊣∑⌒〖〗@ξζω□∮〓※∴ぷ▂▃▅▆█ ∏卐【】√ ∩¤々♀♂∞①ㄨ≡▂ ▂ ▃ ▄ ▅ ▆ ▇ █┗┛╰╮、央拖〖婪В·ˉˇ¨〃々—~‖…‘’“”〔〕〈 〉《》「」『』〖〗【】±+-×÷∧∨∑∏∪∩∈√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∶∵∴∷♂♀°′″℃$¤¢£‰§№〇 回□■⊿▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▓※→←↑↓〓⒔匾唷ⅱⅲⅳⅴⅵⅶⅷⅸⅹ①②③④⑤⑥⑦⑧⑨⑩⒈⒉⒊⒋ ⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ!"#¥%&'()*+柬讨,-./0123456789:;<=>袍啡?@ABCDEFGH IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθ ικλμνξοπρστυφχψω︵︶︹︺︿﹀︽︾﹁﹂﹃﹄︻︼︷︸АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюāáǎàēéěèīíǐìōóǒòūúǔ ùǖǘǚǜüêɑńňɡㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ︱︳︴﹏﹋﹌─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇ ╈╉╊╋⊕㊣㈱曱甴囍∟┅﹊﹍╭ ╮╰ ╯_ ^︵^﹕﹗ < > `,·踩官。{}~~() -√ $ @ * & # 卐℡ ぁ〝〞ミ灬№*ㄨ≮≯﹢﹣/∝≌∽≦≧≒﹤﹥じぷ┗┛¥£§я-―‥…‰′″℅℉№℡∕∝∣═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╱╲╳▔▕〆〒〡〢〣〤〥〦〧〨〩㎎ ㎏ ㎜ ㎝ ㎞ ㎡ ㏄ ㏎我
字符集A的亮度分布直方圖:
字符集B:
一乙二十丁廠(chǎng)七卜人入八九幾兒了力乃刀又三于干虧士工土才寸下大丈與萬(wàn)上小口巾山千乞川億個(gè)勺久凡及夕丸么廣亡門(mén)義之尸弓己已子衛(wèi)也女飛刃習(xí)叉馬鄉(xiāng)豐王井開(kāi)夫天無(wú)元專(zhuān)云扎藝木五支廳不太犬區(qū)歷尤友匹車(chē)巨牙屯比互切瓦止少日中岡貝內(nèi)水見(jiàn)午牛手毛氣升長(zhǎng)仁什片仆化仇幣仍?xún)H斤爪反介父從今兇分乏公倉(cāng)月氏勿欠風(fēng)丹勻?yàn)貘P勾文六方火為斗憶訂計(jì)戶(hù)認(rèn)心尺引丑巴孔隊(duì)辦以允予勸雙書(shū)幻玉刊示末未擊打巧正撲扒功扔去甘世古節(jié)本術(shù)可丙左厲右石布龍平滅軋東卡北占業(yè)舊帥歸且旦目葉甲申叮電號(hào)田由史只央兄叼叫另叨嘆四生失禾丘付仗代仙們儀白仔他斥瓜乎叢令用甩印樂(lè)句匆冊(cè)犯外處冬鳥(niǎo)務(wù)包饑主市立閃蘭半汁匯頭漢寧穴它討寫(xiě)讓禮訓(xùn)必議訊記永司尼民出遼奶奴加召皮邊發(fā)孕圣對(duì)臺(tái)矛糾母幼絲式刑動(dòng)扛寺吉扣考托老執(zhí)鞏圾擴(kuò)掃地?fù)P場(chǎng)耳共芒亞芝朽樸機(jī)權(quán)過(guò)臣再協(xié)西壓厭在有百存而頁(yè)匠夸奪灰達(dá)列死成夾軌邪劃邁畢至此貞師塵尖劣光當(dāng)早吐嚇蟲(chóng)曲團(tuán)同吊吃因吸嗎嶼帆歲回豈剛則肉網(wǎng)年朱先丟舌竹遷喬偉傳乒乓休伍伏優(yōu)伐延件任傷價(jià)份華仰仿伙偽自血向似后行舟全會(huì)殺合兆企眾爺傘創(chuàng)肌朵雜危旬旨負(fù)各名多爭(zhēng)色壯沖冰莊慶亦劉齊交次衣產(chǎn)決充妄閉問(wèn)闖羊并關(guān)米燈州汗污江池湯忙興宇守宅字安講軍許論農(nóng)諷設(shè)訪(fǎng)尋那迅盡導(dǎo)異孫陣陽(yáng)收階陰防奸如婦好她媽?xiě)蛴鹩^(guān)歡買(mǎi)紅纖級(jí)約紀(jì)馳巡壽弄麥形進(jìn)戒吞遠(yuǎn)違運(yùn)扶撫壇技?jí)臄_拒找批扯址走抄壩貢攻赤折抓扮搶孝均拋投墳抗坑坊抖護(hù)殼志扭塊聲把報(bào)卻劫芽花芹芬蒼芳嚴(yán)蘆勞克蘇桿杠杜材村杏極李楊求更束豆兩麗醫(yī)辰勵(lì)否還殲來(lái)連步堅(jiān)旱盯呈時(shí)吳助縣里呆園曠圍呀噸足郵男困吵串員聽(tīng)吩吹嗚吧吼別崗帳財(cái)針釘告我亂利禿秀私每兵估體何但伸作伯伶?zhèn)虻湍阕∥话樯碓矸鸾鼜匾鄯涤嘞W韧缀彶砀味悄c龜免狂猶角刪條卵島迎飯飲系言?xún)鰻町€況床庫(kù)療應(yīng)冷這序辛棄冶忘閑間悶判灶燦弟汪沙汽沃泛溝沒(méi)沈沉懷憂(yōu)快完宋宏牢究窮災(zāi)良證啟評(píng)補(bǔ)初社識(shí)訴診詞譯君靈即層尿尾遲局改張忌際陸阿陳阻附妙妖妨努忍勁雞驅(qū)純紗納綱駁縱紛紙紋紡驢紐奉玩環(huán)武青責(zé)現(xiàn)表規(guī)抹攏拔揀擔(dān)坦押抽拐拖拍者頂拆擁抵拘勢(shì)抱垃拉攔拌幸招坡披撥擇抬其取苦若茂蘋(píng)苗英范直茄莖茅林枝杯柜析板松槍構(gòu)杰述枕喪或畫(huà)臥事刺棗雨賣(mài)礦碼廁奔奇奮態(tài)歐壟妻轟頃轉(zhuǎn)斬輪軟到非叔肯齒些虎虜腎賢尚旺具果味昆國(guó)昌暢明易昂典固忠咐呼鳴詠呢岸巖帖羅幟嶺凱敗販購(gòu)圖釣制知垂牧物乖刮稈和季委佳侍供使例版侄偵側(cè)憑僑佩貨依的迫質(zhì)欣征往爬彼徑所舍金命斧爸采受乳貪念貧膚肺肢腫脹朋股肥服脅周昏魚(yú)兔狐忽狗備飾飽飼變京享店夜廟府底劑郊廢凈盲放刻育閘鬧鄭券卷單炒炊炕炎爐沫淺法泄河沾淚油泊沿泡注瀉泳泥沸波潑澤治怖性怕憐怪學(xué)寶宗定宜審宙官空簾實(shí)試?yán)稍?shī)肩房誠(chéng)襯衫視話(huà)誕詢(xún)?cè)撛斀C錄隸居屆刷屈弦承孟孤陜降限妹姑姐姓始駕參艱線(xiàn)練組細(xì)駛織終駐駝紹經(jīng)貫奏春幫珍玻毒型掛封持項(xiàng)垮挎城撓政赴趙擋挺括拴拾挑指墊掙擠拼挖按揮挪某甚革薦巷帶草繭茶荒茫蕩榮故胡南藥標(biāo)枯柄棟相查柏柳柱柿欄樹(shù)要咸威歪研磚厘厚砌砍面耐耍牽殘殃輕鴉皆背戰(zhàn)點(diǎn)臨覽豎省削嘗是盼眨哄顯啞冒映星昨畏趴胃貴界虹蝦蟻思螞雖品咽罵嘩咱響哈咬咳哪炭峽罰賤貼骨鈔鐘鋼鑰鉤卸缸拜看矩怎牲選適秒香種秋科重復(fù)竿段便倆貸順修保促侮儉俗俘信皇泉鬼侵追俊盾待律很須敘劍逃食盆膽勝胞胖脈勉狹獅獨(dú)狡獄狠貿(mào)怨急饒蝕餃餅彎將獎(jiǎng)哀亭亮度跡庭瘡瘋疫疤姿親音帝施聞閥閣差養(yǎng)美姜叛送類(lèi)迷前首逆總煉炸炮爛剃潔洪灑澆濁洞測(cè)洗活派洽染濟(jì)洋洲渾濃津恒恢恰惱恨舉覺(jué)宣室宮憲突穿竊客冠語(yǔ)扁襖祖神祝誤誘說(shuō)誦墾退既屋晝費(fèi)陡眉孩除險(xiǎn)院娃姥姨姻嬌怒架賀盈勇怠柔壘綁絨結(jié)繞驕繪給絡(luò)駱絕絞統(tǒng)耕耗艷泰珠班素蠶頑盞匪撈栽捕振載趕起鹽捎捏埋捉捆捐損都哲逝撿換挽熱恐壺挨恥耽恭蓮莫荷獲晉惡真框桂檔桐株橋桃格校核樣根索哥速逗栗配翅辱唇夏礎(chǔ)破原套逐烈殊顧轎較頓斃致柴桌慮監(jiān)緊黨曬眠曉鴨晃晌暈蚊哨哭恩喚啊唉罷峰圓賊賄錢(qián)鉗鉆鐵鈴鉛缺氧特犧造乘敵秤租積秧秩稱(chēng)秘透筆笑筍債借值倚傾倒倘俱倡候俯倍倦健臭射躬息徒徐艦艙般航途拿爹愛(ài)頌翁脆脂胸胳臟膠腦貍狼逢留皺餓戀槳漿衰高席準(zhǔn)座脊癥病疾疼疲效離唐資涼站剖競(jìng)部旁旅畜閱羞瓶拳粉料益兼烤烘煩燒燭煙遞濤浙澇酒涉消浩海涂浴浮流潤(rùn)浪浸漲燙涌悟悄悔悅害寬家宵宴賓窄容宰案請(qǐng)朗諸讀扇襪袖袍被祥課誰(shuí)調(diào)冤諒談?wù)x剝懇展劇屑弱陵陶陷陪娛娘通能難預(yù)桑絹繡驗(yàn)繼球理捧堵描域掩捷排掉堆推掀授教掏掠培接控探據(jù)掘職基著勒黃萌蘿菌菜萄菊萍菠營(yíng)械夢(mèng)梢梅檢梳梯桶救副票戚爽聾襲盛雪輔輛虛雀堂常匙晨睜瞇眼懸野啦晚啄距躍略蛇累唱患唯崖嶄崇圈銅鏟銀甜梨犁移笨籠笛符第敏做袋悠償偶偷您售停偏假得銜盤(pán)船斜盒鴿悉欲彩領(lǐng)腳脖臉脫象夠猜豬獵貓猛餡館湊減毫麻癢痕廊康庸鹿盜章竟商族旋望率著蓋粘粗粒斷剪獸清添淋淹渠漸混漁淘液淡深婆梁滲情惜慚悼懼惕驚慘慣寇寄宿窯密謀謊禍謎逮敢屠彈隨蛋隆隱婚嬸頸績(jī)緒續(xù)騎繩維綿綢綠琴斑替款堪搭塔越趁趨超提堤博揭喜插揪搜煮援裁擱摟攪握揉斯期欺聯(lián)散惹葬葛董葡敬蔥落朝辜葵棒棋植森椅椒棵棍棉棚棕惠惑逼廚廈硬確雁殖裂雄暫雅輩悲紫輝敞賞掌晴暑最量噴晶喇遇喊景踐跌跑遺蛙蛛蜓喝喂喘喉幅帽賭賠黑鑄鋪鏈銷(xiāo)鎖鋤鍋銹鋒銳短智毯鵝剩稍程稀稅筐等筑策篩筒答筋箏傲傅牌堡集焦傍儲(chǔ)奧街懲御循艇舒番釋禽臘脾腔魯猾猴然饞裝蠻就痛童闊善羨普糞尊道曾焰港湖渣濕溫渴滑灣渡游滋溉憤慌惰愧愉慨割寒富竄窩窗遍裕褲裙謝謠謙屬屢強(qiáng)粥疏隔隙絮嫂登緞緩編騙緣瑞魂肆攝摸填搏塌鼓擺攜搬搖搞塘攤蒜勤鵲藍(lán)墓幕蓬蓄蒙蒸獻(xiàn)禁楚想槐榆樓概賴(lài)酬感礙碑碎碰碗碌雷零霧雹輸督齡鑒睛睡睬鄙愚暖盟歇暗照跨跳跪路跟遣蛾蜂嗓置罪罩錯(cuò)錫鑼錘錦鍵鋸矮辭稠愁籌簽簡(jiǎn)毀舅鼠催傻像躲微愈遙腰腥腹騰腿觸解醬痰廉新韻意糧數(shù)煎塑慈煤煌滿(mǎn)漠源濾濫滔溪溜滾濱粱灘慎譽(yù)塞謹(jǐn)福群殿辟障嫌嫁疊縫纏靜碧璃墻撇嘉摧截誓境摘摔聚蔽慕暮蔑模榴榜榨歌遭酷釀酸磁愿需弊裳顆嗽蜻蠟蠅蜘賺鍬鍛舞穩(wěn)算籮管僚鼻魄貌膜膊膀鮮疑饅裹敲豪膏遮腐瘦辣竭端旗精歉熄熔漆漂漫滴演漏慢寨賽察蜜譜嫩翠熊凳騾縮慧撕撒趣趟撐播撞撤增聰鞋蕉蔬橫槽櫻橡飄醋醉震霉瞞題暴瞎影踢踏踩蹤蝶蝴囑墨鎮(zhèn)靠稻黎稿稼箱箭篇僵躺僻德艘膝膛熟摩顏毅糊遵潛潮懂額慰劈操燕薯薪薄顛橘整融醒餐嘴蹄器贈(zèng)默鏡贊籃邀衡膨雕磨凝辨辯糖糕燃澡激懶壁避繳戴擦鞠藏霜霞瞧蹈螺穗繁辮贏(yíng)糟糠燥臂翼驟鞭覆蹦鐮翻鷹警攀蹲顫瓣爆疆壤耀躁嚼嚷籍魔灌蠢霸露囊罐⊙﹕﹗<>`,·。{}~~()-√$@*ξζω□∮℃$¤¢£‰§№"
字符集B的亮度分布直方圖:
字符集C:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz⊙﹕﹗<>`,·境输。{}~~()-√$@*ξζω□∮℃$¤¢£‰§№
字符集C的亮度分布直方圖:
字符集A包含亮度分布相對(duì)均勻的各種符號(hào)蔗牡,字符集B包含各種中文文字,數(shù)量較多嗅剖,字符集C主要是英文字母辩越,個(gè)數(shù)較少⌒帕福可以通過(guò)亮度直方圖考察前面給出的兩個(gè)條件黔攒。
字符亮度計(jì)算方法如下,亮度計(jì)算結(jié)果塞入數(shù)組里面强缘。
2.圖片亮度計(jì)算和字符繪制方法
處理思路是督惰,將圖片按照n*n的像素塊來(lái)替換字符,按照n*n的像素為單位進(jìn)行亮度值的計(jì)算旅掂,然后將對(duì)應(yīng)位置替換為亮度所對(duì)應(yīng)的字符即可赏胚。
字符的映射規(guī)則也很簡(jiǎn)單,亮度和塊亮度最接近的字符里面隨機(jī)選一個(gè)就行了商虐。
調(diào)整塊的大小也很重要觉阅,上圖說(shuō)明的是3*3的像素為一個(gè)塊。
3.效果調(diào)優(yōu)
基于以上兩個(gè)步驟便可以處理完成圖片了秘车,剩下的就是給程序套兩個(gè)循環(huán)典勇,再debug一下。直接看效果吧鲫尊,先來(lái)一張不優(yōu)化的痴柔,直接按照上述步驟處理。
被打貓:
參數(shù):使用字符集A疫向,塊大小14*14咳蔚,分辨率532*556,處理效果如下:
不是很好看搔驼,先來(lái)看看原圖亮度直方圖(14*14個(gè)像素為一個(gè)單位進(jìn)行統(tǒng)計(jì)):
處理結(jié)果亮度直方圖(14*14為單位):
我們先來(lái)分析一下原圖的亮度直方圖:原圖高亮度像素和低亮度像素(14*14為一個(gè)像素)數(shù)量太多了谈火,而中間值像素?cái)?shù)量過(guò)少,圖像亮度過(guò)渡不明顯舌涨。
再來(lái)分析一下參數(shù)設(shè)定:
首先糯耍,14*14的塊太大了,處理結(jié)果細(xì)節(jié)描述不夠細(xì)致。然后温技,字符集A的亮度直方圖顯示革为,其亮度主要分布在129-255區(qū)間,0-128取值較少舵鳞,導(dǎo)致0-128取值的塊亮度跳躍大震檩,且字符變化少;129-255區(qū)間的塊則亮度過(guò)渡相對(duì)平滑蜓堕,同一亮度字符變化也相對(duì)豐富抛虏。不過(guò)似乎字符集B和C也有類(lèi)似的問(wèn)題。
調(diào)整一下參數(shù)優(yōu)化一下吧:
參數(shù)調(diào)整1套才,塊調(diào)整得小一些(14*14→6*6):
細(xì)致了不少迂猴,但還是缺乏朦朧感(低對(duì)比度)。
參數(shù)調(diào)整2背伴,將原圖的亮度映射整體偏移+128沸毁,也就是說(shuō)從128亮度開(kāi)始繪制:
由于字符集A亮度集中在129-255,因此我將亮度整體偏移128挂据,從128開(kāi)始繪制以清,這樣每一個(gè)亮度有更多的字符來(lái)繪制(去上面看看直方圖就知道了),亮度過(guò)渡更平滑崎逃。但是這樣一來(lái)偏移后超出255的亮度就沒(méi)辦法繪制了掷倔,因此決定犧牲對(duì)比度來(lái)?yè)Q取所有顏色都能映射:
參數(shù)調(diào)整3,將原圖的亮度映射尺度*0.5,將原圖0-255映射到字符集的129-255:
這樣子朦朧感也有了个绍,我們換成字符集B看看勒葱,
參數(shù)調(diào)整4,更換為字符集B:
字符集B亮度過(guò)渡更加平滑巴柿,且字符非常多凛虽,同一亮度的字符相對(duì)于字符集A來(lái)說(shuō)更多了。
看一下四次優(yōu)化后的亮度直方圖(仍然以14*14為單位)广恢,大多數(shù)亮度值都落在字符集B主要分布的129-255區(qū)域凯旋,這樣亮度過(guò)渡既細(xì)膩(描述的字符多)又帶有朦朧感(對(duì)比度低)。
總結(jié)
圖片能夠處理好了钉迷,gif和視頻也是一樣的方法至非。通過(guò)改變字符集,像素塊的大小糠聪,映射起點(diǎn)亮度荒椭,映射尺度,RGB通道等參數(shù)可以調(diào)試出不同的效果舰蟆。
另外趣惠,多寫(xiě)一寫(xiě)總結(jié)自己做過(guò)的事情是個(gè)好習(xí)慣狸棍。