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
|