首先讓我祭出一張數(shù)學(xué)王子高斯的照片,這位印在德國馬克上的神人有多牛呢? 他是近代數(shù)學(xué)的奠基人之一拍鲤,與牛頓, 阿基米德并稱頂級三大數(shù)學(xué)家十性,隨便找一個編程語言的數(shù)學(xué)庫斤富,里面一定有和他名字相關(guān)的一堆函數(shù)熊尉。
開始正文之前罐柳,讓我們再來膜拜一下19歲的高斯如何用一把圓規(guī)和沒有刻度的尺子畫出正十七邊形。
下面我就拿高斯這張肖像畫作為示例如何用Python將他帽子的顏色換了狰住。
計算機(jī)分析圖片不可能像人類的肉眼一樣進(jìn)行觀察张吉,再用右腦進(jìn)行思考,它能識別的只有數(shù)字催植,下面我們從計算機(jī)的角度來對圖片做一個簡單的認(rèn)知肮蛹。
機(jī)器的認(rèn)知中任何一個圖片都是由很多像素排列組成,每個像素點(diǎn)就是圖片組成的最小原子创南,因此圖片可以看作是一個二維數(shù)組蔗崎,包含坐標(biāo)和顏色。
其中坐標(biāo)可以繼續(xù)拆成一個二維數(shù)組分別是X軸和Y軸扰藕,而顏色用RGB來表示則可拆解為紅綠藍(lán)三維數(shù)組。
我先用python來幾行簡單代碼把數(shù)學(xué)王子的照片轉(zhuǎn)化為數(shù)組看看到底是什么內(nèi)容芳撒。
看看打印結(jié)果的輸出邓深,這張圖的像素有607行(寬度),474列(高度)笔刹,也就是287718個像素組成了這張圖片芥备。我再用photoshop打開這張圖片看看像素大小,完全匹配舌菜。
接下來再來幾行代碼把整張圖片的矩陣打印出來看看萌壳,同時用photoshop框選一下高斯帽子的范圍,大概是兩個矩形的拼接日月,在此范圍內(nèi)我也挑幾個點(diǎn)(帽子袱瓮,皮膚,背景)打印出來看看爱咬。
為何是兩個矩形? 因為大神的眼珠也是黑色和帽子比較相似尺借,所以繞道劃取范圍。
簡單分析一下規(guī)律精拟,其實帽子燎斩,背景虱歪,皮膚的顏色色差還是比較明顯的。為了讓帽子從黑色變成紅色就把RGB定為(200, 20, 20)
先來兩個兩重循環(huán)把兩個長方形拼接的范圍都替換掉栅表,重新調(diào)出圖片看看效果笋鄙,已經(jīng)成功刷上紅色了,接下來就要看如何更精準(zhǔn)的上色怪瓶。
接下來判斷一下這個范圍內(nèi)的像素顏色哪些應(yīng)該替換哪些應(yīng)該保留萧落。隨便根據(jù)經(jīng)驗設(shè)置一下參數(shù),看看效果再調(diào)整幾次劳殖。
我選擇的判斷條件是RGB均小于45铐尚, 比較保守,因為畫多了比較麻煩哆姻,畫少了還可以修復(fù)宣增。
運(yùn)行一下,果然按這個參數(shù)上色后覆蓋不均勻矛缨,于是我加了個簡單粗暴的顏色擴(kuò)散方法爹脾,判斷一下左右兩邊或者上下是否有紅色,有則替換當(dāng)前像素為紅色箕昭。
對比間距從大到小(10, 5, 2)修復(fù)了三次后效果就差不多了灵妨。
到此為止帽子的邊緣還比較毛糙,顏色擴(kuò)散的方式也比較粗暴落竹,下一篇再研究如何用OpenCV的Canny Edge Detection勾畫圖案邊緣泌霍,用Gaussian Blurring(看,高斯的名字又出現(xiàn)了)平滑處理交界處述召。