拍個自拍,讓Python告訴你,軍訓過後你黑了幾度?
- 2019 年 10 月 7 日
- 筆記
一年一度的大學開學季,一年一度的軍訓季。
在六月中旬高考結束之後,萬千學子迎來了他們人生中最長也是最無憂無慮的假期,到了八月底九月初,他們將踏上人生的一段重要旅程——大學。
然而等待他們的第一課,便是軍訓。
每所高校對軍訓的要求不同,從時間來看,短的只有5天,長的多達一個月,根據網上一份軍訓時間排行榜,比如清華大學,以34天穩居第二。(警校排第一也是無可厚非了,不過吉林的院校確實熱衷軍訓,前十中兩所吉林的院校上榜)
除了一些開始又晚、時間又長的院校(比如重慶大學),大部分院校的軍訓應該已經結束了,然而經歷了軍姿、齊步、正步、閱兵甚至拉練的「摧殘」後,軍訓歲月在身上留下的最深的痕迹便是——曬!黑!了!
圖片來自網路
軍訓前和軍訓後,就是「白古」和「黑古」的差別啊!想知道自己軍訓後究竟晒黑了多少么?下面文摘菌就帶你用Python看看,自己究竟軍訓後黑了幾個度。
基於RGB和YCbCr顏色空間的混合膚色檢測
想知道自己的皮膚顏色,首先要將皮膚檢測出來。
膚色檢測有很多方法,比如:
- 基於RGB的顏色空間模型;
- 基於橢圓皮膚模型的皮膚檢測;
- YCrCb顏色空間Cr分量+Otsu法閾值分割;
- 基於YCrCb顏色空間Cr,Cb範圍篩選法;
- HSV顏色空間H範圍篩選法;
- opencv自帶膚色檢測類AdaptiveSkinDetector;
相關鏈接:
https://blog.csdn.net/qq_22527639/article/details/81501565
2004年,Georgy Kukharev和Adam Nowosielski為了提高模型的穩定性,將多個顏色空間結合,提出RGB顏色空間和YCbCr顏色空間的混合膚色檢測器。像素值滿足如下條件:
實現的程式碼也很簡單,首先引入必要的包:
import cv2 import numpy as np from matplotlib import pyplot as plt
然而操縱影像,將RGB顏色空間3通道的值和YCbCr顏色空間3通道的值結合起來,然後根據判別條件進行膚色檢測:
def skin_color(imgFile): # load an original image img = cv2.imread(imgFile) rows,cols,channels = img.shape # convert color space from rgb to ycbcr imgYcc = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB) # convert color space from bgr to rgb img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # prepare an empty image space imgSkin = np.zeros(img.shape, np.uint8) # copy original image imgSkin = img.copy() s=0 sum_R=sum_G=sum_B=0 for r in range(rows): for c in range(cols): # non-skin area if skin equals 0, skin area otherwise skin = 0 # get values from rgb color space R = img.item(r,c,0) G = img.item(r,c,1) B = img.item(r,c,2) # get values from ycbcr color space Y = imgYcc.item(r,c,0) Cr = imgYcc.item(r,c,1) Cb = imgYcc.item(r,c,2) # skin color detection if R > G and R > B: if (G >= B and 5 * R - 12 * G + 7 * B >= 0) or (G < B and 5 * R + 7 * G - 12 * B >= 0): if Cr > 135 and Cr < 180 and Cb > 85 and Cb < 135 and Y > 80: # print 'Skin detected!'
參考鏈接:
https://blog.csdn.net/shadow_guo/article/details/43635181
對比色卡,看看你黑了幾度
檢測出了皮膚的區域,我們就需要將皮膚區域的顏色RGB值計算出來,然後與色卡進行對比。
說到色卡,不得不提到Pantone(潘通)——一家專註於研究顏色的公司,以其Pantone顏色匹配系統(PMS)而聞名,該系統被廣泛用於各種行業,特別是平面設計,時裝設計,產品設計,印刷和製造,並支援從設計到生產的色彩管理。
2013年,潘通發布了一款彩通膚色指南(PANTONE SkinTone Guide),這個指南根據科學測量各種人類皮膚類型中數千種實際膚色而建立,為再現實體膚色而配製,被稱為人類膚色的完整視覺參考。
110種人類膚色被從1Y01 SP至4R15 SP編號,適用於各個人種。
文摘菌從中選取了比符合中國人膚色的1Y01-1Y13作為對比色卡。
從左至右依次為0-12度
然後將膚色顏色RGB與色卡的RGB數值進行對比,因為人眼對於R、G、B的敏感程度不同,在轉換的時候需要給予不同的權重。
人類視覺對綠色最敏感,因此它具有最大的係數值(0.7152),對藍色最不敏感,因此具有最小的係數(0.0722)。
def Compare(list,color): min=100 count=len(list) for i in range(count): value=list[i] error=abs(color[0]-value[0])*0.2126+abs(color[1]-value[1])*0.7152+abs(color[2]-value[2])*0.0722 if(error<min): min=error index=i return index+1
最後我們輸入「白古」和「黑古」的圖片,與比色卡的RGB數值進行對比,輸出結果:
if __name__ == '__main__': img_before= 'images/before1.jpg' img_after='images/after.jpg' color_before=skin_color(img_before) color_after=skin_color(img_after) print("before:the extracted RGB value of the skin color is {0}".format(color_before)) print("after:the extracted RGB value of the color is {0}".format(color_after)) list=[(200, 172, 153), (200, 169, 149), (197, 166, 145), (194, 163, 142), (190, 157, 134), (187, 152, 129), (182, 146, 121), (177, 136, 108), (168, 127, 100), (160, 118, 90), (148, 108, 81), (135, 98, 73), (119, 87, 65)] #color_dir="skin_color" #skincolor.load_color(color_dir,list) #print(list) #print(list) degree_before=Compare(list,color_before) degree_after=Compare(list,color_after) print("before:the degree of the skin color is {0}".format(degree_before)) print("after:the degree of the skin color is {0}".format(degree_after))
輸出的結果如下圖所示: