| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 | # -*- coding:utf-8 -*-from RGB import *from image_util import *import os, sys, timeimport cv2 as cvimport numpy as npimport randomimport mathclass PQDetect():    def __init__(self):        self.RGBColor = RGBColor()    def isSnowPic2(self, pic_path):        im1 = cv.imread(pic_path)        h1, w1, c1 = im1.shape        print h1, w1, c1        im1_1 = im1[0:h1 / 2, 0:w1 / 2]        im1_2 = im1[0:h1 / 2, w1 / 2:w1]        im1_3 = im1[h1 / 2:h1, 0:w1 / 2]        im1_4 = im1[h1 / 2:h1, w1 / 2:w1]        hist_list = []        hist_list.append(cv.calcHist([im1_1], [0], None, [256], [0, 256]))        hist_list.append(cv.calcHist([im1_2], [0], None, [256], [0, 256]))        hist_list.append(cv.calcHist([im1_3], [0], None, [256], [0, 256]))        hist_list.append(cv.calcHist([im1_4], [0], None, [256], [0, 256]))        count = 0        totalHist = 0        for hist_1 in hist_list:            for hist_2 in hist_list:                diffHist = cv.compareHist(hist_1, hist_2, cv.HISTCMP_BHATTACHARYYA)                if diffHist <> 0:                    count += 1                    totalHist += diffHist        four_zone_diff = totalHist / count        print four_zone_diff        rhist = cv.calcHist([im1_1], [0], None, [256], [0, 256])        bhist = cv.calcHist([im1_2], [2], None, [256], [0, 256])        bgr_diff = cv.compareHist(rhist, bhist, cv.HISTCMP_BHATTACHARYYA)        print bgr_diff        if four_zone_diff < 0.1 and bgr_diff < 0.2:            return True        else:            return False    '''    判断传入的图片,是否为ATV无信号雪花屏。定义雪花屏:清晰度25左右.然后随机取20个区域,查看直方图趋势相似度。    :param pic_path:图片路径    :threshold: 直方图差异临界值。 范围 0 ~ 1    :sharpDiff: 清晰度容错范围值。    :return : True代表是雪花屏,False代表不是雪花屏    '''    def isSnowPic(self, pic_path, threshold=0.1, sharpDiff=10, sharpSnow = 25):        im1 = cv.imread(pic_path)        h1, w1, c1 = im1.shape        sharpP = self.detSharpLaplacian(pic_path)        hist_list = []        for i in range(20):            x1 = random.randint(0,h1/2)            y1 = random.randint(0,w1/2)            rect_h = h1/2            rect_w = w1/2            # print [x1,y1, x1+ rect_w, y1+rect_h]            im = cutMat(im1, [x1,y1, x1+ rect_h, y1+rect_w])            hist = cv.calcHist([im], [0], None, [256], [0, 256])            hist_list.append(hist)        count = 0        totalHist = 0        for hist_1 in hist_list:            for hist_2 in hist_list:                diffHist = cv.compareHist(hist_1, hist_2, cv.HISTCMP_BHATTACHARYYA)                if diffHist <> 0:                    count += 1                    totalHist += diffHist        four_zone_diff = totalHist / count        print "isSnowPic:", four_zone_diff,sharpP        if four_zone_diff < threshold and abs(sharpP - sharpSnow) <=  sharpDiff:            return True        else:            return False    '''    根据传入的图片路径,计算图片色温    '''    def calculateCCT(self, pic_path):        img = cv.imread(pic_path)        # xyImg = cv.cvtColor(img,cv.COLOR_BGR2XYZ)        xyImg = cv.cvtColor(img, cv.COLOR_RGB2XYZ)        # print "xyImg",xyImg        #色温计算        X = np.average(xyImg[:,:,0])        Y = np.average(xyImg[:,:,1])        Z = np.average(xyImg[:,:,2])        x = X/(X+Y+Z) #色谱XYZ转换成色坐标x        y = Y/(X+Y+Z) #色谱XYZ转换成色坐标y        print "calculateCCT,x,y:",x,y        n = (x-0.3320)/(0.1858-y)        print "calculateCCT,n:",n        # CCT = 437*n**3 + 3601*n**2 + 6831*n + 5517        # CCT = 437*math.pow(n,3) + 3601*math.pow(n,2) + 6831*n + 5517        CCT=-449*math.pow(n,3) + 3525*math.pow(n,2) - 6823.3*n + 5520.33        print "calculateCCT,CCT:",CCT        return CCT    '''        Tenengrad梯度方法利用Sobel算子分别计算水平和垂直方向的梯度,同一场景下梯度值越高,图像越清晰。        以下是具体实现,这里衡量的指标是经过Sobel算子处理后的图像的平均灰度值,值越大,代表图像越清晰。        :param 图片路径        :return float, 值越大,代表清晰度越高        '''    def detSharpTenengrad(self, pic_path):        img = cv.imread(pic_path)        grayImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)        sobelImg = cv.Sobel(grayImg, cv.CV_16U, 1, 1)        grayV = cv.mean(sobelImg)[0]  # 图像的平均灰度        # cv.putText(img, str(grayV), (20,50), cv.FONT_HERSHEY_COMPLEX, 0.8, (255,255,0))        # cv.imshow("清晰度",img)        # cv.waitKey(0)        return grayV    '''    采用Laplacian梯度方法检测清晰度    :param 图片路径    :return float, 值越大,代表清晰度越高    '''    def detSharpLaplacian(self, pic_path):        img = cv.imread(pic_path)        return self.detImgSharpLaplacian(img)    def detImgSharpLaplacian(self, img):        grayImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)        sobelImg = cv.Laplacian(grayImg, cv.CV_16U)[0]        grayV = cv.mean(sobelImg)[0]  # 图像的平均灰度        # cv.putText(img, str(grayV), (20, 50), cv.FONT_HERSHEY_COMPLEX, 0.8, (255, 255, 0))        # cv.imshow("清晰度", img)        # cv.waitKey(0)        return grayV    '''    采用方差(Variance)方法检测清晰度。    方差是概率论中用来考察一组离散数据和其期望(即数据的均值)之间的离散(偏离)成都的度量方法。    方差较大,表示这一组数据之间的偏差就较大,组内的数据有的较大,有的较小,分布不均衡;    方差较小,表示这一组数据之间的偏差较小,组内的数据之间分布平均,大小相近。    :param 图片路径    :return float, 值越大,代表清晰度越高    '''    def detSharpVariance(self, pic_path):        img = cv.imread(pic_path)        grayImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)        # 求灰度图像的标准差        stdValueImg = cv.meanStdDev(grayImg)        # print stdValueImg        meanValue = stdValueImg[1][0][0]  # 求得均方差。stdValueImg:(均差array([[ 16.58646894]]), 标准差array([[ 10.1834467]]))        grayV = meanValue * meanValue        # cv.putText(img, str(grayV), (20, 50), cv.FONT_HERSHEY_COMPLEX, 0.8, (255, 255, 0))        # cv.imshow("清晰度", img)        # cv.waitKey(0)        return grayV
 |