画像クラスタリングのpython実装

13329 ワード

その後のプロジェクトは映像クラスタリングに使うので、これまではENVIで実現していましたが、pythonを学びたいと思います.学習のこの1篇:小さいプロジェクトのクラスタリング

import cv2
import matplotlib.pyplot as plt
import numpy as np


# ======    ======
#      
imPath = 'C:\\Users\lp\Desktop\photo.jpg'

#     
origin = cv2.imread(imPath)

#           
origin = cv2.cvtColor(origin, cv2.COLOR_BGR2GRAY)

#       
h, w = origin.shape
print("        :{}*{}".format(h, w))

#       ,          
alpha = int(input("
: "
)) # newH = int(h / alpha) newW = int(w / alpha) print("
: {}*{}"
.format(newH, newW)) origin = cv2.resize(origin, (newW, newH)) # numOfClass = int(input("
: "
)) # roundForLoop = int(input("
: "
)) print() # ====== ====== print("———— ————") # numOfClass valueArange = origin.max() - origin.min() keyValueList = [] # numOfClass for i in range(1, numOfClass + 1): keyValueList.append(valueArange / numOfClass * i / 2) # keyValueList flagMatrix = np.zeros((newH, newW)) for r in range(roundForLoop): for row in range(newH): for col in range(newW): temp = [] for i in range(numOfClass): temp.append(np.abs(origin[row, col] - keyValueList[i])) # index = temp.index(min(temp)) # flag flagMatrix[row, col] = index # keyValueList temp = np.zeros(numOfClass) ct = np.zeros(numOfClass) for row in range(newH): for col in range(newW): temp[int(flagMatrix[row, col])] += origin[row, col] ct[int(flagMatrix[row, col])] += 1 for i in range(numOfClass): keyValueList[i] = temp[i] / ct[i] print(" : {} / {}".format(r + 1, roundForLoop)) # plt.subplot(121) plt.imshow(origin) plt.title("Origin Image") # plt.subplot(122) plt.imshow(flagMatrix) plt.title("Result1 Image
Round = {}
class = {}"
.format(roundForLoop, numOfClass)) plt.show()

反復プロセス:1、クラスタリングの反復プロセスは各画素点を遍歴し、各画素点をkeyValue Listの各要素とそれぞれ差をつけ、この差の絶対値が小さいほど、その画素点がクラスに近いことを説明する.この要素を最も近いクラスに分類します.2、すべての画素点を巡回した後、各クラスの画素点に対してその平均値を求め、その値で対応するkeyValueリストの要素を更新し、反復を完了する.keyValueListは、画像画素の各クラスの平均値を低から高まで表す長さの分類数の記憶空間である.3、最終的には原図と同じ大きさのflag行列が得られ、行列の各要素は原図中の画素が存在するカテゴリに対応する.4、このflagマトリクスを出力すると、クラスタリングした分類結果が得られる.