| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 | 
							- # -*- 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
 
 
  |