Changeset - aeca91e58167
[Not reviewed]
default
0 0 1
Laman - 6 years ago 2019-01-07 00:54:02

exp: image color analysis
1 file changed with 99 insertions and 0 deletions:
0 comments (0 inline, 0 general)
exp/histogram.py
Show inline comments
 
new file 100644
 
import os
 
import sys
 

	
 
import cv2 as cv
 
import numpy as np
 
import scipy.cluster
 

	
 
from annotations import DataFile,computeBoundingBox
 

	
 

	
 
def createHistogram(img):
 
	# Convert BGR to HSV
 
	hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
 
	# H in range(0,180)
 
	# S in range(0,256)
 
	# V in range(0,256)
 
	planes=cv.split(hsv)
 
	hhist=cv.calcHist(planes,[0],None,[256],(0,180),accumulate=False)
 
	shist=cv.calcHist(planes,[1],None,[256],(0,256),accumulate=False)
 
	vhist=cv.calcHist(planes,[2],None,[256],(0,256),accumulate=False)
 

	
 
	width=512
 
	height=400
 
	binSize=width//256
 

	
 
	histImage = np.zeros((height, width, 3), dtype=np.uint8)
 
	cv.normalize(hhist, hhist, alpha=0, beta=height, norm_type=cv.NORM_MINMAX)
 
	cv.normalize(shist, shist, alpha=0, beta=height, norm_type=cv.NORM_MINMAX)
 
	cv.normalize(vhist, vhist, alpha=0, beta=height, norm_type=cv.NORM_MINMAX)
 

	
 
	for i in range(1, 256):
 
		cv.line(histImage, ( binSize*(i-1), height - int(round(hhist[i-1][0])) ),
 
						( binSize*(i), height - int(round(hhist[i][0])) ),
 
						( 255, 0, 0), thickness=2)
 
		cv.line(histImage, ( binSize*(i-1), height - int(round(shist[i-1][0])) ),
 
						( binSize*(i), height - int(round(shist[i][0])) ),
 
						( 0, 255, 0), thickness=2)
 
		cv.line(histImage, ( binSize*(i-1), height - int(round(vhist[i-1][0])) ),
 
						( binSize*(i), height - int(round(vhist[i][0])) ),
 
						( 0, 0, 255), thickness=2)
 

	
 
	cv.imshow('Source image', img)
 
	cv.imshow('calcHist Demo', histImage)
 
	cv.waitKey()
 

	
 

	
 
def quantize(img):
 
	arr=np.reshape(img,(-1,3)).astype(np.float)
 
	colors=np.array([[0,0,0],[255,255,255],[193,165,116]],np.float)
 
	print(colors)
 
	(centers,distortion)=scipy.cluster.vq.kmeans(arr,colors)
 
	print(centers)
 
	return centers
 

	
 

	
 
def computeClosest(x,centers):
 
	res=centers[0]
 
	d=np.linalg.norm(res-x)
 
	for c in centers:
 
		d_=np.linalg.norm(c-x)
 
		if d_<d:
 
			res=c
 
			d=d_
 
	return res
 

	
 

	
 
filepath=sys.argv[1]
 
annotations=DataFile(sys.argv[2])
 
filename=os.path.basename(filepath)
 
(x1,y1,x2,y2)=computeBoundingBox(annotations[filename][0])
 
(w,h)=(x2-x1,y2-y1)
 
img=cv.imread(filepath)
 
(x3,x4,y3,y4)=(x1+w//4,x1+3*w//4,y1+h//4,y1+3*h//4)
 
print(x3,x4,y3,y4)
 
rect=img[y3:y4,x3:x4,:]
 
centers=quantize(rect)
 

	
 
# colors=[(0,0,0),(255,255,255),(255,200,0)]
 
# colorMap=colors[:]
 
# for (i,c) in enumerate(centers):
 
# 	colorMap[i]=computeClosest(c,colors)
 

	
 
for x in range(x1,x2):
 
	for y in range(y1,y2):
 
		pix=img[y,x]
 
		img[y,x]=computeClosest(pix,centers)
 

	
 
rect=img[y1:y2,x1:x2]
 
maskB=cv.inRange(rect,np.array([0,0,0]),np.array([60,60,60]))
 
maskB=cv.erode(maskB,np.ones((3,3),np.uint8))
 
maskW=cv.inRange(rect,np.array([160,160,160]),np.array([256,256,256]))
 
maskW=cv.erode(maskW,np.ones((3,3),np.uint8))
 

	
 
cv.imshow(filename,img)
 
cv.waitKey()
 
cv.imshow(filename,maskB)
 
cv.waitKey()
 
cv.imshow(filename,maskW)
 
cv.waitKey()
0 comments (0 inline, 0 general)