使用百度AI進行黑白圖像上色

【使用攻略】【圖像技術(shù)】黑白圖像上色

一棍郎、需求描述

人們的生活越過越豐富多彩钦讳≡那可是家里珍藏已久的舊相冊掐暮,經(jīng)過歲月的沖洗邊角旮旯兒已泛黃。舊照片是對過往歲月的真實記錄政钟,爺爺奶奶年輕時的相貌路克,衣著樟结、神態(tài),遵循著過去的潮流和規(guī)范精算。去年瓢宦,百度聯(lián)合新華社獻禮改革開放40周年,發(fā)起“給舊時光上色”活動灰羽,借助AI的力量驮履,“喚醒”爺爺奶奶手中的黑白老照片,讓每個人看到那個年代最真實的景象廉嚼。

其實疲吸,借助百度【黑白圖像上色】技術(shù),不僅可以給老照片上色前鹅,還能給黑白水墨畫等上色摘悴,讓大家體驗一把不一樣的水墨畫,也是一種新奇的感受舰绘。

當然蹂喻,如果能夠給一整篇的【黑白漫畫】上色,輸出【彩色漫畫】捂寿,那這個【黑白圖像上色】技術(shù)在這方面會有很大的作為的口四,相信會受到很多漫畫愛好者的喜愛。

或者可以換個思維秦陋,對于【漫畫制作】這塊蔓彩,應(yīng)該是先畫出黑白輪廓,然后給圖片上色驳概,如果合理利用百度【黑白圖像上色】技術(shù)赤嚼,那么在畫出黑白輪廓后,參考百度【黑白圖像上色】技術(shù)處理后的圖片顺又,然后再調(diào)整顏色的深淺明暗更卒,這樣可以大大降低漫畫【上色】的工作量,提高漫畫【上色】的效率稚照,制作出更加精致的漫畫蹂空。

另外,像兒童讀物等文章都會有【插畫】果录,可以利用【黑白圖像上色】技術(shù)上枕,給文章的【黑白插畫】上色,提供更加好看的【彩色插畫】弱恒。

二辨萍、使用攻略

說明:本文采用C# 語言,開發(fā)環(huán)境為.Net Core 2.1斤彼,采用在線API接口方式實現(xiàn)分瘦。

(1)平臺接入


登陸百度智能云-管理中心創(chuàng)建 “圖像處理”應(yīng)用,獲取 “API Key ”和 “Secret Key” :https://console.bce.baidu.com/ai/#/ai/imageprocess/overview/index


(2)接口文檔


文檔地址:https://ai.baidu.com/docs#/ImageProcessing-API/27271a5c

接口描述:智能識別黑白圖像內(nèi)容并填充色彩琉苇,使黑白圖像變得鮮活嘲玫。


請求說明

請求示例

HTTP 方法:POST

請求URL:https://aip.baidubce.com/rest/2.0/image-process/v1/colourize

URL參數(shù):

參數(shù)? 值

access_token? 通過API Key和Secret Key獲取的access_token,參考”Access Token獲取

Header如下:

參數(shù)? 值

Content-Type? application/x-www-form-urlencoded

Body中放置請求參數(shù)并扇,參數(shù)詳情如下:

請求參數(shù)

參數(shù)是否必選類型可選值范圍說明

imagetruestring-base64編碼后大小不超過4M去团,最短邊至少64px,最長邊最大800px穷蛹,長寬比3:1以內(nèi)土陪。注意:圖片的base64編碼是不包含圖片頭的,如(data:image/jpg;base64,)


返回說明

返回參數(shù)

字段是否必選類型說明

log_id是uint64唯一的log id肴熏,用于問題定位

image否stringbase64編碼圖片

返回示例

{

"log_id": "6876747463538438254",

"image": "處理后圖片的Base64編碼"

}


(3)源碼共享

3.1-根據(jù) API Key 和 Secret Key 獲取 AccessToken


///

/// 獲取百度access_token

///

/// API Key

/// Secret Key

///

public static string GetAccessToken(string clientId, string clientSecret)

{

string authHost = "https://aip.baidubce.com/oauth/2.0/token";

HttpClient client = new HttpClient();

List> paraList = new List>();

paraList.Add(new KeyValuePair("grant_type", "client_credentials"));

paraList.Add(new KeyValuePair("client_id", clientId));

paraList.Add(new KeyValuePair("client_secret", clientSecret));

HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;

string result = response.Content.ReadAsStringAsync().Result;

JObject jo = (JObject)JsonConvert.DeserializeObject(result);

string token = jo["access_token"].ToString();

return token;

}

3.2-調(diào)用API接口獲取識別結(jié)果

1鬼雀、Startup.cs文件 的Configure(IApplicationBuilder app, IHostingEnvironment env) 方法中開啟虛擬目錄映射功能:


string webRootPath = HostingEnvironment.WebRootPath;//wwwroot目錄

app.UseStaticFiles(new StaticFileOptions

{

FileProvider = new PhysicalFileProvider(

Path.Combine(webRootPath, "Uploads", "BaiduAIs")),

RequestPath = "/BaiduAIs"

});


2、建立Index.cshtml文件


2.1 前臺代碼:

??? 由于html代碼無法原生顯示蛙吏,只能簡單說明一下:

??? 主要是一個form表單源哩,需要設(shè)置屬性enctype="multipart/form-data",否則無法上傳圖片鸦做;

??? form表單里面有兩個控件:

??? 一個Input:type="file"励烦,asp-for="FileUpload" ,上傳圖片用泼诱;

??? 一個Input:type="submit"坛掠,asp-page-handler="Colourize" ,提交并返回識別結(jié)果治筒。

??? 一個img:src="@Model.curPath"屉栓,顯示需要上色的圖片。

??? 一個img:src="@Model.imgProcessPath"耸袜,顯示上色后的圖片系瓢。

??? 最后顯示后臺 msg 字符串列表信息,如果需要輸出原始Html代碼句灌,則需要使用@Html.Raw()函數(shù)夷陋。

2.2 后臺代碼:???????

[BindProperty]

public IFormFile FileUpload { get; set; }

private readonly IHostingEnvironment HostingEnvironment;

public List msg = new List();

public string curPath { get; set; }

public string imgProcessPath { get; set; }

public BodySearchModel(IHostingEnvironment hostingEnvironment)

{

HostingEnvironment = hostingEnvironment;

}

public async Task OnPostColourizeAsync()

{

if (FileUpload is null)

{

ModelState.AddModelError(string.Empty, "本地圖片!");

}

if (!ModelState.IsValid)

{

return Page();

}

msg = new List();

string webRootPath = HostingEnvironment.WebRootPath;//wwwroot目錄

string fileDir = Path.Combine(webRootPath,

"Uploads//BaiduAIs//");

string imgName =

await UploadFile(FileUpload, fileDir);

string fileName = Path.Combine(fileDir, imgName);

string imgBase64 = GetFileBase64(fileName);

curPath =

Path.Combine("/BaiduAIs/", imgName);//需在Startup.cs 文件 的 Configure(IApplicationBuilder app, IHostingEnvironment env)方法中開啟虛擬目錄映射功能

string result = GetImageProcessJson(imgBase64,

“你的API KEY”, “你的SECRET KEY”);

JObject jo =

(JObject)JsonConvert.DeserializeObject(result);

try

{

string imageProcessBase64 = jo["image"].ToString();

msg.Add("log_id:" + jo["log_id"].ToString());

string processImgName =

Guid.NewGuid().ToString("N") + ".png";

string imgSavedPath = Path.Combine(webRootPath,

"Uploads//BaiduAIs//", processImgName);

imgProcessPath = Path.Combine(

"/BaiduAIs/", processImgName);

await GetFileFromBase64(imageProcessBase64, imgSavedPath);

}

catch(Exception e1)

{

msg.Add(result);

}

return Page();

}

///

/// 上傳文件,返回文件名

///

/// 文件上傳控件

/// 文件絕對路徑

///

public static async Task UploadFile(IFormFile formFile, string fileDir)

{

if (!Directory.Exists(fileDir))

{

Directory.CreateDirectory(fileDir);

}

string extension = Path.GetExtension(formFile.FileName);

string imgName = Guid.NewGuid().ToString("N") + extension;

var filePath = Path.Combine(fileDir, imgName);

using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))

{

await formFile.CopyToAsync(fileStream);

}

return imgName;

}


///

/// 返回圖片的base64編碼

///

/// 文件絕對路徑名稱

///

public static String GetFileBase64(string fileName)

{

FileStream filestream = new FileStream(fileName, FileMode.Open);

byte[] arr = new byte[filestream.Length];

filestream.Read(arr, 0, (int)filestream.Length);

string baser64 =? Convert.ToBase64String(arr);

filestream.Close();

return baser64;

}

///

/// 文件base64解碼

///

/// 文件base64編碼

/// 生成文件路徑

public static async Task GetFileFromBase64(string base64Str, string outPath)

{

var contents = Convert.FromBase64String(base64Str);

using (var fs = new FileStream(outPath, FileMode.Create, FileAccess.Write))

{

fs.Write(contents, 0, contents.Length);

fs.Flush();

}

}

///

/// 圖像處理Json字符串

///

/// 圖片base64編碼

/// API Key

/// Secret Key

///

public static string GetImageProcessJson(string strbaser64, string clientId, string clientSecret)

{

string token = GetAccessToken(clientId, clientSecret);

string host = "https://aip.baidubce.com/rest/2.0/image-process/v1/colourize?access_token=" + token;

Encoding encoding = Encoding.Default;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);

request.Method = "post";

request.KeepAlive = true;

string str = "image=" + HttpUtility.UrlEncode(strbaser64);

byte[] buffer = encoding.GetBytes(str);

request.ContentLength = buffer.Length;

request.GetRequestStream().Write(buffer, 0, buffer.Length);

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);

string result = reader.ReadToEnd();

return result;

}


三胰锌、效果測試

1骗绕、頁面:

2、識別結(jié)果:

2.1

2.2

2.3

2.4

2.5


四资昧、產(chǎn)品建議

1酬土、試了好幾張黑白圖片,發(fā)現(xiàn)百度的【黑白圖片上色】技能給山水格带、建筑物等實物上色會比較鮮艷撤缴,結(jié)果也比較滿意刹枉,而對于純植物、人物素描等黑白圖片則喜歡涂上【紅色】屈呕,變化不是很大微宝,這方面可能需要再改進一下。

2虎眨、如果能夠降低對輸入圖片的大小蟋软、長寬的限制,就更好了嗽桩。

3岳守、如果能給【黑白圖像】涂上不同的顏色,然后讓用戶選擇自己喜歡的那張碌冶,那就更加好了湿痢,畢竟每個人的審美觀念不同,喜歡的圖片顏色也不一樣的扑庞。

4蒙袍、若【黑白圖像上色】可以輸出多個不同顏色的結(jié)果,那么就可以應(yīng)用到【漫畫制作】中去嫩挤,在漫畫完成【線稿】后害幅,可以利用百度【黑白圖像上色】技術(shù),提供不用顏色的【上色圖】岂昭,為漫畫【上色】這一步驟提供參考以现,大大降低【上色】的難度,提高【上色】效率约啊,最終制作出更加精致的【漫畫】邑遏。

5、可以嘗試開發(fā)【批量黑白圖像】處理功能的應(yīng)用恰矩,比如對一個壓縮包记盒、對一個文件夾內(nèi)的所有圖片進行【上色】處理,然后批量輸出結(jié)果外傅,這樣就可以對【黑白漫畫】進行【上色】處理纪吮,“制作”出【彩色漫畫】了。

6萎胰、一般像兒童讀物等文章都會有【插畫】碾盟,可以利用【黑白圖像上色】技術(shù),給文章的【黑白插畫】上色技竟,提供更加好看的【彩色插畫】冰肴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子熙尉,更是在濱河造成了極大的恐慌联逻,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件检痰,死亡現(xiàn)場離奇詭異包归,居然都是意外死亡,警方通過查閱死者的電腦和手機攀细,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爱态,“玉大人谭贪,你說我怎么就攤上這事〗醯#” “怎么了俭识?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洞渔。 經(jīng)常有香客問我套媚,道長,這世上最難降的妖魔是什么磁椒? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任堤瘤,我火速辦了婚禮,結(jié)果婚禮上浆熔,老公的妹妹穿的比我還像新娘本辐。我一直安慰自己,他們只是感情好医增,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布慎皱。 她就那樣靜靜地躺著,像睡著了一般叶骨。 火紅的嫁衣襯著肌膚如雪茫多。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天忽刽,我揣著相機與錄音天揖,去河邊找鬼。 笑死跪帝,一個胖子當著我的面吹牛宝剖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播歉甚,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼万细,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赖钞,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤腰素,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后雪营,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弓千,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年献起,在試婚紗的時候發(fā)現(xiàn)自己被綠了洋访。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡谴餐,死狀恐怖姻政,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情岂嗓,我是刑警寧澤汁展,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站厌殉,受9級特大地震影響食绿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜公罕,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一器紧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧楼眷,春花似錦品洛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至硝清,卻和暖如春辅斟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芦拿。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工士飒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔗崎。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓酵幕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缓苛。 傳聞我的和親對象是個殘疾皇子芳撒,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 一、功能介紹 對于輸入的一張圖片(可正常解碼,且長寬比適宜)笔刹,檢測圖像中的所有人體并返回每個人體的矩形框位置芥备,識別...
    筱之雪閱讀 2,109評論 0 0
  • 【使用攻略】【圖像技術(shù)】紅酒識別 一、需求描述 “來一瓶82年的拉菲”舌菜,相信大家一定聽過這個梗(對于紅酒的認識萌壳,我...
    筱之雪閱讀 1,112評論 0 0
  • 一、需求描述 大家在出去旅游的時候日月,往往會對景點里的特色事物感興趣袱瓮,而一般情況下,如果沒有導游的介紹爱咬,我們不太清楚...
    筱之雪閱讀 1,389評論 0 0
  • 【使用攻略】【評測報告】【黑白圖像上色】 1.功能描述: 百度智能識別黑白圖像內(nèi)容并填充色彩尺借,使黑白圖像變得鮮活,...
    才能我浪費閱讀 914評論 0 0
  • 早 黃山行的感受寫完了 晚上下班路上跑步3公里 最近運動量減少台颠,但都是利用碎片化時間跑步和瑜伽 晚上集中看書
    麗麗我我閱讀 129評論 0 0