Local Dimming 仿真算法



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()

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鲲君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值