|
- # -- coding: UTF-8
- import cv2
- import matplotlib.pyplot as plt
- from sklearn.cluster import KMeans
- import os
-
- boundaries = [
- ([100,80,0],[240,220,110]), # yellow
- ([0,40,50],[110,180,250]), # blue
- ([0,60,0],[60,160,70]), # green
- ]
- color_attr = ["黄牌","蓝牌",'绿牌','白牌','黑牌']
-
- threhold_green = 13
- threhold_blue = 13
- threhold_yellow1 = 50
- threhold_yellow2 = 70
-
- # plt.figure()
- # plt.axis("off")
- # plt.imshow(image)
- # plt.show()
-
- import numpy as np
- def centroid_histogram(clt):
- numLabels = np.arange(0, len(np.unique(clt.labels_)) + 1)
- (hist, _) = np.histogram(clt.labels_, bins=numLabels)
-
- # normalize the histogram, such that it sums to one
- hist = hist.astype("float")
- hist /= hist.sum()
-
- # return the histogram
- return hist
-
-
- def plot_colors(hist, centroids):
- bar = np.zeros((50, 300, 3), dtype="uint8")
- startX = 0
-
- for (percent, color) in zip(hist, centroids):
-
- endX = startX + (percent * 300)
- cv2.rectangle(bar, (int(startX), 0), (int(endX), 50),
- color.astype("uint8").tolist(), -1)
- startX = endX
-
- # return the bar chart
- return bar
-
- def search_boundaries(color):
- for i,color_bound in enumerate(boundaries):
- if np.all(color >= color_bound[0]) and np.all(color <= color_bound[1]):
- return i
- return -1
-
- def judge_color(color):
- r = color[0]
- g = color[1]
- b = color[2]
- if g - r >= threhold_green and g - b >= threhold_green:
- return 2
- if b - r >= threhold_blue and b - g >= threhold_blue:
- return 1
- if r- b > threhold_yellow2 and g - b > threhold_yellow2:
- return 0
- if r > 200 and b > 200 and g > 200:
- return 3
- if r < 50 and b < 50 and g < 50:
- return 4
- return -1
-
- def judge_plate_color(img):
- image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
- image = image.reshape((image.shape[0] * image.shape[1], 3))
- clt = KMeans(n_clusters=2)
- clt.fit(image)
-
- hist = centroid_histogram(clt)
- index = np.argmax(hist)
- #print clt.cluster_centers_[index]
- #color_index = search_boundaries(clt.cluster_centers_[index])
- color_index = judge_color(clt.cluster_centers_[index])
- if color_index == -1:
- if index == 0:
- secound_index = 1
- else:
- secound_index = 0
- color_index = judge_color(clt.cluster_centers_[secound_index])
-
- if color_index == -1:
- print clt.cluster_centers_
- bar = plot_colors(hist, clt.cluster_centers_)
- # show our color bart
- plt.figure()
- plt.axis("off")
- plt.imshow(bar)
- plt.show()
-
- if color_index != -1:
- return color_attr[color_index],clt.cluster_centers_[index]
- else:
- return None,clt.cluster_centers_[index]
|