123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- # -*- coding:utf-8 -*-
- '''
- 颜色空间CIE LUV
- '''
- import os, sys, time
- import cv2 as cv
- import numpy as np
- import colorsys
- import math
- class LUV():
- def __init__(self, stdimg = None, testimg=None):
- self.stdimg = stdimg
- self.testimg = testimg
- def setSTDImage(self, img):
- self.stdimg = img
- def setTestImage(self ,img):
- self.testimg = img
- '''
- 计算单个指定区域的LUV平均值
- '''
- def getAverageLUV(self, img, area=None):
- if (area is None):
- area = (0, 0, img.shape[1], img.shape[0]) # mat shape:高、宽、颜色值个数
- # print "getAverageLUV", img.shape, area
- # print img.shape
- img = np.array(img)
- if len(area) == 4:
- x1 = area[0]
- y1 = area[1]
- x2 = area[2]
- y2 = area[3]
- img = img[y1:y2+1, x1:x2+1]
- # img = img[0:80, 0:100]
- # print img.shape
- total_L = 0
- total_U = 0
- total_V = 0
- pixel_total = img.shape[0] * img.shape[1]
- # print "pixel_total:",pixel_total
- for x in range(0, img.shape[0]):
- for y in range(0, img.shape[1]):
- total_L = total_L + img[x][y][0]
- total_U = total_U + img[x][y][1]
- total_V = total_V + img[x][y][2]
- return total_L / pixel_total, total_U / pixel_total, total_V / pixel_total
- else:
- return None, None, None
- '''
- 计算所有区域的LUV平均值
- '''
- def getMAverageLUV(self, img, areaList):
- total_L ,total_U, total_V, pixel_total = 0 ,0 ,0 ,0
- for area in areaList:
- L ,U ,V ,P = self.countTotalPLuv(img, area)
- total_L += L
- total_U += U
- total_V += V
- pixel_total += P
- # print "getMAverageLUV:",area,L,U,V,P
- if (pixel_total == 0):
- return None, None, None
- return total_L /pixel_total ,total_U /pixel_total ,total_V /pixel_total
- '''
- 计算整张图片指定区域Luv颜色值总和。
- '''
- def countTotalPLuv(self, img, area=None):
- if (area is None):
- area = (0, 0, img.shape[1], img.shape[0]) # mat shape:高、宽、颜色值个数
- # print "getAverageLUV", img.shape, area
- # print img.shape
- img = np.array(img)
- if len(area) == 4:
- x1 = area[0]
- y1 = area[1]
- x2 = area[2]
- y2 = area[3]
- img = img[y1:y2 +1, x1:x2 +1]
- # img = img[0:80, 0:100]
- # print img.shape
- total_L = 0
- total_U = 0
- total_V = 0
- pixel_total = img.shape[0] * img.shape[1]
- # print "pixel_total:",pixel_total
- for x in range(0, img.shape[0]):
- for y in range(0, img.shape[1]):
- total_L = total_L + img[x][y][0]
- total_U = total_U + img[x][y][1]
- total_V = total_V + img[x][y][2]
- return total_L ,total_U , total_V , pixel_total
- else:
- return None, None, None, None
- def getDiffLevel(self, stdLuv, testLuv):
- return self.getDiffUV(stdLuv, testLuv)
- def getDiffuvLevel(self, stdLuv, testLuv):
- diff = self.getDiffuv(stdLuv, testLuv)
- return diff[2]
- def getDiffluvLevel(self ,stdLuv, testLuv):
- return self.getDiffLUV(stdLuv, testLuv)
- def getDiffUV(self, stdLuv, testLuv):
- tmp = np.int32(testLuv[0]) - np.int32(stdLuv[0])
- lDiff = abs(tmp)
- tmp = np.int32(testLuv[1]) - np.int32(stdLuv[1])
- uDiff = abs(tmp)
- tmp = np.int32(testLuv[2]) - np.int32(stdLuv[2])
- vDiff = abs(tmp)
- lineDiff = np.sqrt(np.square(uDiff )+ np.square(vDiff))
- return uDiff ,vDiff ,lineDiff
- def getDiffuv(self, stdLuv, testLuv):
- return self.getDiffUV(stdLuv, testLuv)
- def getDiffLUV(self, stdLuv, testLuv):
- tmp = np.int32(testLuv[0]) - np.int32(stdLuv[0])
- lDiff = abs(tmp)
- tmp = np.int32(testLuv[1]) - np.int32(stdLuv[1])
- uDiff = abs(tmp)
- tmp = np.int32(testLuv[2]) - np.int32(stdLuv[2])
- vDiff = abs(tmp)
- lineDiff = np.sqrt(np.square(lDiff) + np.square(uDiff )+ np.square(vDiff))
- return lDiff, uDiff ,vDiff ,lineDiff
- '''
- # 描述:获取HSV平均值
- # 参数:
- # img_path:原图路径
- # area:要截图的区域
- # '''
- def getAverageHSV(self, img_path, area = None):
- img = cv.imread(img_path)
- if img is None:
- print u'Img is None, please check the img path!'
- return None, None, None
- # 求RGB;
- if (area is None):
- area = (0, 0, img.shape[1], img.shape[0]) # mat shape:高、宽、颜色值个数
- if len(area) == 4:
- x1 = area[0]
- y1 = area[1]
- x2 = area[2]
- y2 = area[3]
- img = img[y1:y2 +1, x1:x2 +1]
- # 宽,高;
- width, height = abs(x2 - x1), abs(y2 - y1)
- # print 'area=',area
- total_B = 0
- total_G = 0
- total_R = 0
- # pixel_total = hsv.shape[0] * hsv.shape[1]
- pixel_total = width * height
- if width == 0 or height == 0:
- print u'宽或高为0'
- return None, None, None
- # print 'width,hieght=',width,height,pixel_total
- for y in range(0, height):
- for x in range(0, width):
- total_B += img[y][x][0]
- total_G += img[y][x][1]
- total_R += img[y][x][2]
- # print u't->b,g,r=',total_B,total_G,total_R
- b ,g ,r = total_B / pixel_total, total_G / pixel_total, total_R / pixel_total
- # print 'bgr=',b,g,r
- # 转成hsv;
- hsv = self.rgb2hsv(r ,g ,b)
- # print 'hsv-1',hsv
- # hsv = colorsys.rgb_to_hsv(r,g,b)
- # print 'hsv-2',hsv
- return [round(hsv[0 ] /2), round(hsv[1]), round(hsv[2])]
- else:
- return [None, None, None]
- # def rgb2hsv(self, r, g, b):
- # r, g, b = r/255.0, g/255.0, b/255.0
- # mx = max(r, g, b)
- # mn = min(r, g, b)
- # df = mx-mn
- # if mx == mn:
- # h = 0
- # elif mx == r:
- # h = (60 * ((g-b)/df) + 360) % 360
- # elif mx == g:
- # h = (60 * ((b-r)/df) + 120) % 360
- # elif mx == b:
- # h = (60 * ((r-g)/df) + 240) % 360
- # if mx == 0:
- # s = 0
- # else:
- # s = df/mx
- # v = mx
- # return h, s, v
- def rgb2hsv(self, r, g, b):
- r, g, b = r/ 255.0, g / 255.0, b / 255.0
- mx = max(r, g, b)
- mn = min(r, g, b)
- df = mx - mn
- # h值
- if mx == mn:
- h = 0
- elif mx == r and g >= b:
- h = (60 * (g - b) / df) % 360
- elif mx == r and g < b:
- h = (60 * ((g - b) / df) + 360) % 360
- elif mx == g:
- h = (60 * ((b - r) / df) + 120) % 360
- elif mx == b:
- h = (60 * ((r - g) / df) + 240) % 360
- # s值
- if mx == 0:
- s = 0
- else:
- s = df / mx * 255
- # v值
- v = mx * 255
- # 返回;
- return h, s, v
- def isUVSimilar(self, stdLuv, testLuv, diffLevel=20):
- udiff, vdiff, lineDiff = self.getDiffUV(stdLuv, testLuv)
- if lineDiff <= diffLevel:
- return True
- else:
- return False
|