####1.回顧
上次對驗證碼進行了去噪和灰度化,這次對它進一步地分類處理,這裡用顏色區分,顯然是分成4個類
####2.**
關於演算法原理我就不多說,下面看**
#encoding=utf-8
from pil import image
import math
import copy
import random
class pixel(object):
def __init__(self,x,y):
self.x = x
self.y = y
self.child = # 儲存歸屬該類的xy值
def getdistance(self,p): # 獲取距離
return math.sqrt(((self.x - p.x)**2 +(self.y - p.y)**2))
@property
def xy(self): # 獲取xy
return (self.x,self.y)
@property
def minx(self): # 獲取屬於該類的最小x值
return min([i[0] for i in self.child])
@property
def maxx(self):
return max([i[0] for i in self.child])+1
@property
def miny(self):
return min([i[1] for i in self.child])
@property
def maxy(self):
return max([i[1] for i in self.child])+1
@property
def shape(self): # 獲取該類方形分布,左上角,右下角
return (self.minx,self.miny,self.maxx,self.maxy)
# 獲取有用畫素點
def getpixelarr(img):
pixelarr =
for x in range(img.size[0]):
for y in range(img.size[1]):
rgb = img.getpixel((x,y))
if rgb == (0,0,0):
return pixelarr
# 對點分類
def divideclass(img,n):
pixelarr = getpixelarr(img)
minx = min([i.x for i in pixelarr])
maxx = max([i.x for i in pixelarr])
c = (maxx - minx)/n
y = img.size[1]/2.0
k =
for i in range(n):
showk(k)
for *** in range(10): #進行10輪計算
print ***
for i in pixelarr:
dis = 1000
p = k[0]
for j in k:
if i.getdistance(j)=7:
return k
k = calck(k)
return k
def showk(k):
print 'k:'
for i in k:
print i.xy
# 重新計算k
def calck(k):
arr =
for i in k:
d = reduce(lambda a,b:(a[0]+b[0],a[1]+b[1]),i.child)
n = len(i.child)
return arr
def main():
img = image.open("c:/fafu/tif2/19.tif").convert('rgb') # 請新增一張tif格式的
classarr = divideclass(img,4) # 分類
c = [(255,0,0),(255,0,255),(0,0,255),(0,0,0),(199,97,20)] # rgb陣列
for n,i in enumerate(classarr):
for xy in i.child:
img.putpixel(xy,c[n%5])
img.show()
if __name__=="__main__":
main()
###3.總結
本來一開始我用的是層次聚類自頂向下,後來發現效果並不好,有時會聚成3個類,有時5個,不知道是我原理弄錯了,還是特殊情況.k-means聚類呢,效率高適合處理有明顯的分界線的資料,但是對球面資料就無可奈何了.另外附一張圖檢驗實驗成果
騷氣的Python之heapq的使用
官網文件 heapq.heapify x 把 list 堆排序 下文中引數裡的 heap 都是由這一步得到的 list,如果未先 heapify 會出現錯誤 import heapq a 2,4,1,5,6,3 heapq.heapify a print a 1,4,2,5,6,3 heapq.im...
騷氣的Python之大頂堆演算法
大頂堆是一種結合二叉樹的排序演算法,平均時間複雜度為 nlogn 不清楚該演算法的可以先看詳細的介紹 coding utf 8 class heaptree object leftchild none rightchild none value none 排好順序的節點設定不可訪問 visitabl...
機器學習實戰之KMean
kmeans演算法步驟 1.確定聚類個數k 2.隨機選擇k個質心 3.對於所有樣本點 根據樣本點到質心的距離分類 4.分類完成後,如果所有樣本點的類別沒有變化,演算法結束 如果有變化,重新計算質心 當前類中樣本的平均值 回到步驟3 幾個問題 1.聚類個數k的確定 2.初始時質心的選取 3.容易出現區...