大家好,今天我們來教大家用Python/ target=_blank class=infotextkey>Python識(shí)別黃色圖片,識(shí)別黃色圖片的算法有很多,今天來講一個(gè)最簡(jiǎn)單的算法,僅需10行代碼。
算法原理:將圖片轉(zhuǎn)換為YCbCr模式,在圖片中尋找圖片色值像素,如果在皮膚色值內(nèi)的像素面積超過整個(gè)畫面的1/3,就認(rèn)為是黃色圖片。
好了,原理很簡(jiǎn)單,那我們來編寫代碼試試
實(shí)戰(zhàn)
需要安裝python圖片庫PIL支持,PIL是Python的圖像處理標(biāo)準(zhǔn)庫,支持多種格式,并提供強(qiáng)大的圖形與圖像處理功能。目前PIL的官方最新版本為1.1.7,支持的版本為python 2.5, 2.6, 2.7,并不支持python3,因此我們用pillow代替,安裝命令如下
pip install pillow
ok,安裝完pillow后我們來寫核心算法代碼
新建python文件detect_porn.py如下:
import sys,PIL.Image as Image
img = Image.open(sys.argv[1]).convert('YCbCr')
w,h = img.size #獲取圖片的寬高
data = img.getdata()
cnt = 0
for i, ycbcr in enumerate(data): #獲取圖片的ycbcr值
y, cb, cr = ycbcr
if 86 <= cb <= 117 and 140 <= cr <= 168:#皮膚區(qū)域色值檢測(cè)累積
cnt += 1
print '%s %s 黃圖.'%(sys.argv[1], '是' if cnt > w * h * 0.3 else '不是')
保存后運(yùn)行:
python detect_porn.py photo.png
總結(jié)
這個(gè)算法用在簡(jiǎn)單場(chǎng)景還是夠用了,如果場(chǎng)景復(fù)雜一點(diǎn)就不太準(zhǔn)確了,
例如:整個(gè)圖片如果是人的頭像,那么皮膚色值的像素累積必然超過3/1,采用上面的算法就會(huì)被認(rèn)為是黃圖,有點(diǎn)牽強(qiáng)了,不過可以先識(shí)別有沒有頭部以下區(qū)域,然后再使用此算法判斷,更高級(jí)一點(diǎn)的就是將涉黃圖片給python,讓它自己看自己學(xué)習(xí)判斷,訓(xùn)練一個(gè)模型,然后調(diào)優(yōu)就好了。
好了,大家有什么要說的可以在下方評(píng)論。