雖說是剛剛學(xué)習(xí)機器學(xué)習(xí)戴卜,但還是編寫了一個小小的代碼,可能有不足之處琢岩,請指出與諒解投剥。
這個代碼是手勢識別必不可少的一步,大致內(nèi)容就是將一張手的圖片轉(zhuǎn)化為黑白照片担孔,再轉(zhuǎn)化為模糊的黑白照片江锨,最后化為只有手的輪廓(黑)和背景顏色(白),代碼如下:
# -*- coding:utf-8 -*-
from PIL import Image, ImageFilter
import numpy as np
def f(c):
r, g, b = c
return int(float(r)*0.21 + float(g)*0.72 + float(b)*0.07)
def ff(c):
r, g, b = c
return (r+g+b)/3
# stage 1: convert 2 gray
def rgb2gray(im):
w, h = im.size
ret = Image.new("L",(w,h))
for i in range(w):
for j in range(h):
ret.putpixel([i,j],f(im.getpixel((i, j))))
return ret
# stage 2: Gaussian Blur
def GaussianBlur(im):
ftr = ImageFilter.GaussianBlur(22.0)
new_im = im.filter(ftr)
return new_im
def OTSU(im):
w, h = im.size
arr = []
total = 0
points = w*h
for i in range(w):
for j in range(h):
c = im.getpixel((i,j))
arr.append(c)
total += c
# 顏色為x的點一共有d[x]個
d = {}
for i in range(256):
d[i] = 0
for i in arr:
d[i] += 1
# 顏色為0的點糕篇,到顏色為x的點啄育,一共有count[x]個
# count[x] = d[0] + d[1] + ... + d[x]
count = []; count.append(d[0])
# 顏色小于等于x的點的加權(quán)和為color[x]
# color[x] = 0*d[0] + 1*d[1] + ... + x*d[x]
color = []; color.append(0)
for i in range(1, 256): # i = 1 to 255
#print i
count.append(count[i-1] + d[i])
color.append(color[i-1] + d[i]*i)
"""
print "-"*40
print count
print "-"*40
print color
"""
"""
c 為分界的顏色的灰度值
w1 = d[0] + d[1] + ... + d[c] = count[c]
w2 = d[c+1] + d[c+2] + ... + d[255]
= (d[1] + d[2] + ... + d[255]) - w1
= (w * h) - w1
u1 = (d[0]*0 + d[1]*1 + ... + d[c]*c) / (d[0] + d[1] + ... + d[c])
= color[c] / w1
u2 = (d[c+1]*(c+1) + d[c+2]*(c+2) + ... + d[255]*255) / (d[c+1] + d[c+2] + ... + d[255])
= (d[0]*0 + d[1]*1 + ... + d[255]*255? -? color[c]) / w2
= (color[255] - color[c]) / w2
求c的值使得
delta = w1*w2*((u1-u2)**2)最大
"""
maxDelta = 0.0
gray = 0
for c in range(256):
w1 = count[c]
w2 = points - w1
if w1 == 0 or w2 == 0:
continue
u1 = float(color[c]) / w1
u2 = float(color[255] - color[c]) / w2
delta = w1*w2*((u1-u2)**2)
print "[w1] ", w1, "[u1] ", u1,
print "[w2] ", w2, "[u2] ", u2,
print "\t", delta, "\t", maxDelta,
if delta > maxDelta:
maxDelta = delta
gray = c
print " BINGO! ", gray
else:
print ""
return gray
def threshold(t, image):
# 二值化
intensity_array = []
w,h = image.size
for i in range(w):
for j in range(h):
intensity = image.getpixel((i,j))
if (intensity <= t):
x = 0
else:
x = 255
image.putpixel([i, j], x)
return image
#####################################################
# 程序執(zhí)行過程
#####################################################
# 轉(zhuǎn)換成黑白
im = Image.open('hand.jpg')
im = rgb2gray(im)
im.save("gray.jpg")
# 進行模糊
im = GaussianBlur(im)
im.save("Gaussian.jpg")
# 求二值化的分界點
g = OTSU(im)
print g
# 使用分界點進行二值化
im = threshold(g, im)
im.save("OTSU.jpg")