import cv2 as cv
import numpy as np
import random as rd
import matplotlib.pyplot as plt
# import mediapipe as mp
# 阈值及参数
Tl = 60.0625
Tm = 5
Tb = 3
Tsf = 20
Ttf = 0.125
Lmax = 255 #Lmax可允许的最大LED亮度强度水平
# <LED亮度强度算法>
# Linit(n)为第n个LED块的初始亮度强度,
# 第一步的输出;LMAX可允许的最大LED亮度强度水平;
# TL 是一个预定义参数,用来控制局部调节水平,由表1可知为0.0625;
# PNUM(第n个图像块的总像素数量);
# Hn(i)是第n个图像块的直方图;W(i)是预定义的权重向量,论文里为变量i的平方
def Linit(In):
m = In.shape[0]
n = In.shape[1]
num_p = m * n
s=0
# 参数:输入图像 通道 mask 灰度级 像素范围
hist = cv.calcHist(In, [0], None, [256], [0,256], accumulate=False)
for i2, x in enumerate(hist):
h = hist[i2]
W = pow(i2, 2)
s = s + (h * W) #求得所有像素与灰度级平方的乘积
print("i2", i2, "s", s, "h", h)
L_temp = (Tl / num_p) * s
L_init = min(Lmax, L_temp)
# min_max = cv.minMaxLoc(hist)
# print('b_hist.minMaxLoc:', min_max)
# print('b_hist.非0数:', cv.countNonZero(hist))
# for i, v in enumerate(hist):
# print(v, end=' ')
# if (i + 1) % 16 == 0: print()
return L_init
# <LED暗区域增强算法>
# Lben 是增强的LED亮度强度灰度;
# Lmean 是当前图像的所有图像块的 Linit的平均值;
# TM用来定义暗区域的阈值;
# TB用来控制暗区域增强水平的预定义参数
def Lben(Lini, L_mean):
if (Lini < L_mean or Tm < L_mean): # L_mean = 20
L_ben = Lini
else:
L_ben = min(Lmax, Lini + Tb * (Lini - L_mean))
return L_ben
# <LED空间滤波器处理>
def S_filter(LSF_ini,temp_Lben):
temp_Lsf = temp_Lben
h = temp_Lben.shape[0]
w = temp_Lben.shape[1]
# min_val, max_val, min_indx, max_indx = cv.minMaxLoc(temp_Lsf)
# print("min_val, max_val:", min_val, max_val)
img_re = cv.resize(temp_Lben, (w - 2, h - 2), cv.INTER_LINEAR)
# for nx in range(2, h - 1): #h=10
# print("nx", nx)
# for ny in range(2, w - 1): #w=10
# # 取出对应需要进行运算区域的数据
# img_re = temp_Lsf[(nx - 1):(nx + 1), (ny - 1):(ny + 1)]
# img_re[h - 2, w - 2] = temp_Lsf[(nx - 1), (ny - 1)]
# # 邻域的8个数据
# temp11 = LSF_temp1
# print("temp11", temp11)
# temp11 = LSF_temp1(1,:), LSF_temp1(2, 1), LSF_temp1(2, 3), LSF_temp1(3,:)
# # 取出极大值
# temp_max = max(temp11, 0)
# Len_nn = LSF_ini
# Lsf = max(Len_nn, (max_val - Tsf))
return 0
def Gaussianfilter(img,kernel):
# 读取img行数核列数
h = img.shape[0]
w = img.shape[1]
# 直接拷贝父对象
img1 = img
# 去掉边缘
for i in range(1,h-1):
for j in range(1,w-1):
sum = 0
for k in range(-1,2):
for l in range(-1,2):
sum += img[i+k,j+l]*kernel[k+1,l+1]
img1[i,j] = sum
return img1
def divide_method(img, m, n): # 分割成m行n列
h, w = img.shape[0], img.shape[1]
grid_h = int(h * 1.0 / (m - 1) + 0.5) # 每个网格的高
grid_w = int(w * 1.0 / (n - 1) + 0.5) # 每个网格的宽
# 满足整除关系时的高、宽
h = grid_h * (m - 1)
w = grid_w * (n - 1)
# 图像缩放
img_re = cv.resize(img, (w, h), cv.INTER_LINEAR) # 也可以用img_re=skimage.transform.resize(img, (h,w)).astype(np.uint8)
gx, gy = np.meshgrid(np.linspace(0, w, n), np.linspace(0, h, m))
gx = gx.astype(np.int32)
gy = gy.astype(np.int32)
divide_image = np.zeros([m - 1, n - 1, grid_h, grid_w],
np.uint8) # 这是一个五维的张量,前面两维表示分块后图像的位置(第m行,第n列),后面三维表示每个分块后的图像信息
for i in range(m - 1):
for j in range(n - 1):
divide_image[i, j] = img_re[gy[i][j]:gy[i + 1][j + 1],
gx[i][j]:gx[i + 1][j + 1]]
return divide_image
save_sawuji = "D:\SelfSrc\Video\测试图片\sh - Seve杀无迹_0011234567890abcdefghijklmnopqrstuvwxyz.mp4"
Noir_Embedded = "D:/SelfSrc/Video/[SAMSUNG-4K]黑色马戏_Cirque du Noir_Embedded-JDBBS.ts"
SceenFlow = "D:\SelfSrc\Video\my\ScreenFlow.mp4"
cap = cv.VideoCapture(Noir_Embedded)
while cap.isOpened():
ret,src = cap.read()
frame = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
dst = cv.resize(frame, (1366,678))
# 选择高斯生成函数3*3,其中sigama = 3
# gs = cv.GaussianBlur(dst, (199,299), 1)
temp_Lben = dst
divi_img = divide_method(temp_Lben, 10, 10)
L_init = Linit(divi_img[0,0])
L_ben = Lben(L_init, 50)
F_space = S_filter(divi_img[0,0], divi_img[0,0])
cv.imshow("divi_img", divi_img[0, 0])
for x in range(0,200):
for y in range(0, 200):
dst.itemset((x, y), F_space) # 或 dst[x,y] = L_ben
print("led", dst.item(10,10))
print("L_init:", L_init, "L_ben:", L_ben)
cv.imshow("output image",dst)
cv.waitKey(1)
cap.release()
cv.destroyAllWindows()
Local Dimming 仿真算法
于 2022-09-17 20:04:47 首次发布