# -*- coding:utf-8 -*- from RGB import * from image_util import * import os, sys, time import cv2 as cv import numpy as np import random import math class 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