• 检测照度/噪声水平


      1 from __future__ import division
      2 import os, time, scipy.io
      3 import tensorflow as tf
      4 import numpy as np
      5 import rawpy
      6 import glob
      7 from model_sid_latest import network_my_unet
      8 import platform
      9 from PIL import Image
     10 
     11 # BBF100-2
     12 bbf_w = 4032 // 2
     13 bbf_h = 3024 // 2
     14 
     15 input_dir = 'D:/data/Sony/dataset/illu_detect/'
     16 
     17 
     18 def preprocess(raw, bl, wl):
     19     im = raw.raw_image_visible.astype(np.float32)
     20     im = np.maximum(im - bl, 0)
     21     return im / (wl - bl)
     22 
     23 
     24 def pack_raw_bbf(path):
     25     raw = rawpy.imread(path)
     26     bl = 64
     27     wl = 1023
     28     im = preprocess(raw, bl, wl)
     29     im = np.expand_dims(im, axis=2)
     30     H = im.shape[0]
     31     W = im.shape[1]
     32     if raw.raw_pattern[0, 0] == 0: # CFA=RGGB
     33         out = np.concatenate((im[0:H:2, 0:W:2, :],
     34                               im[0:H:2, 1:W:2, :],
     35                               im[1:H:2, 1:W:2, :],
     36                               im[1:H:2, 0:W:2, :]), axis=2)
     37     elif raw.raw_pattern[0,0] == 2: # BGGR
     38         out = np.concatenate((im[1:H:2, 1:W:2, :],
     39                               im[0:H:2, 1:W:2, :],
     40                               im[0:H:2, 0:W:2, :],
     41                               im[1:H:2, 0:W:2, :]), axis=2)
     42     elif raw.raw_pattern[0,0] == 1 and raw.raw_pattern[0,1] == 0: # GRBG
     43         out = np.concatenate((im[0:H:2, 1:W:2, :],
     44                               im[0:H:2, 0:W:2, :],
     45                               im[1:H:2, 0:W:2, :],
     46                               im[1:H:2, 1:W:2, :]), axis=2)
     47     elif raw.raw_pattern[0,0] == 1 and raw.raw_pattern[0,1] == 2: # GBRG
     48         out = np.concatenate((im[1:H:2, 0:W:2, :],
     49                               im[0:H:2, 0:W:2, :],
     50                               im[0:H:2, 1:W:2, :],
     51                               im[1:H:2, 1:W:2, :]), axis=2)
     52     else:
     53         assert False
     54     # wb = np.array(raw.camera_whitebalance)
     55     # wb[3] = wb[1]
     56     # wb = wb / wb[1]
     57     # out = np.minimum(out * wb, 1.0)
     58     return out
     59 
     60 
     61 in_im = tf.placeholder(tf.float32, [1, bbf_h, bbf_w, 4], name='input')
     62 
     63 # Obtain the noise level map
     64 radius = 3
     65 strides = 32
     66 
     67 # in_patches_r = tf.extract_image_patches(
     68 #     tf.expand_dims(
     69 #         in_im[:, :, :, 0], axis=3),
     70 #     (1, radius, radius, 1),
     71 #     (1, strides, strides, 1),
     72 #     (1, 1, 1, 1),
     73 #     'VALID')
     74 # miu_r = tf.maximum(tf.reduce_mean(in_patches_r, axis=-1, keepdims=True), 1e-7)
     75 # sigma_r = tf.reduce_sum(tf.abs((in_patches_r - miu_r) / miu_r), axis=-1, keepdims=True)/(radius * radius - 1)
     76 
     77 in_patches_g = tf.extract_image_patches(
     78     tf.expand_dims(
     79         in_im[:, :, :, 3], axis=3),
     80     (1, radius, radius, 1),
     81     (1, strides, strides, 1),
     82     (1, 1, 1, 1),
     83     'VALID')
     84 miu_g = tf.maximum(tf.reduce_mean(in_patches_g, axis=-1, keepdims=True), 1e-7)
     85 sigma_g = tf.reduce_sum(tf.abs((in_patches_g - miu_g) / miu_g), axis=-1, keepdims=True)/(radius * radius - 1)
     86 
     87 # in_patches_b = tf.extract_image_patches(
     88 #     tf.expand_dims(
     89 #         in_im[:, :, :, 2], axis=3),
     90 #     (1, radius, radius, 1),
     91 #     (1, strides, strides, 1),
     92 #     (1, 1, 1, 1),
     93 #     'VALID')
     94 # miu_b = tf.maximum(tf.reduce_mean(in_patches_b, axis=-1, keepdims=True), 1e-7)
     95 # sigma_b = tf.reduce_sum(tf.abs((in_patches_b - miu_b) / miu_b), axis=-1, keepdims=True)/(radius * radius - 1)
     96 #
     97 # sigma_level = tf.reduce_mean(tf.minimum(tf.minimum(sigma_r, sigma_g), sigma_b))
     98 
     99 sigma_level = tf.reduce_mean(sigma_g)
    100 illu_level = tf.reduce_mean(miu_g)
    101 print(in_patches_g.shape)
    102 
    103 sess = tf.Session()
    104 # print('============= DAY ============')
    105 # files = glob.glob(input_dir + '/day/*.dng')
    106 # files.sort()
    107 # for i in range(len(files)):
    108 #     noise_level = sess.run(sigma_level, feed_dict={in_im: np.expand_dims(pack_raw_bbf(files[i]), axis=0)})
    109 #     illu = 0.3 / noise_level
    110 #     print(illu)
    111 #
    112 # print('============= NIGHT ============')
    113 # files = glob.glob(input_dir + '/night/*.dng')
    114 # files.sort()
    115 # for i in range(len(files)):
    116 #     noise_level = sess.run(sigma_level, feed_dict={in_im: np.expand_dims(pack_raw_bbf(files[i]), axis=0)})
    117 #     illu = 0.3 / noise_level
    118 #     print(illu)
    119 
    120 print('============= NIGHT ============')
    121 files = glob.glob('C:/Users/Administrator/Desktop/ILLU/*.dng')
    122 files.sort()
    123 for i in range(len(files)):
    124     sigma_, illu_ = sess.run([sigma_level, illu_level], feed_dict={in_im: np.expand_dims(pack_raw_bbf(files[i]), axis=0)})
    125     illu = 0.3 / sigma_
    126     print(illu)
    127     print(illu_)
    128     print('--------------')

    通过检测每个采样像素的邻域均方差来确定画面的整体噪声水平。

    这里需要注意的是每个点的明暗程度不一致,因此需要对均方差进行亮度归一化。

    【上述程序有个BUG】

    在存在明显的光源时,会出现照度测量不正确的情形。为了解决这一问题,引入全局画面亮度作为参考,即:平均照度应该考量总体像素值波动幅度的同时对全局亮度的归一。

     1 from __future__ import division
     2 import os, time, scipy.io
     3 import tensorflow as tf
     4 import numpy as np
     5 import rawpy
     6 import glob
     7 from model_sid_latest import network_my_unet
     8 import platform
     9 from PIL import Image
    10 
    11 # BBF100-2
    12 bbf_w = 4032 // 2
    13 bbf_h = 3024 // 2
    14 
    15 input_dir = 'D:/data/Sony/dataset/illu_detect/'
    16 
    17 
    18 def preprocess(raw, bl, wl):
    19     im = raw.raw_image_visible.astype(np.float32)
    20     im = np.maximum(im - bl, 0)
    21     return im / (wl - bl)
    22 
    23 
    24 def pack_raw_bbf(path):
    25     raw = rawpy.imread(path)
    26     bl = 64
    27     wl = 1023
    28     im = preprocess(raw, bl, wl)
    29     im = np.expand_dims(im, axis=2)
    30     H = im.shape[0]
    31     W = im.shape[1]
    32     if raw.raw_pattern[0, 0] == 0: # CFA=RGGB
    33         out = np.concatenate((im[0:H:2, 0:W:2, :],
    34                               im[0:H:2, 1:W:2, :],
    35                               im[1:H:2, 1:W:2, :],
    36                               im[1:H:2, 0:W:2, :]), axis=2)
    37     elif raw.raw_pattern[0,0] == 2: # BGGR
    38         out = np.concatenate((im[1:H:2, 1:W:2, :],
    39                               im[0:H:2, 1:W:2, :],
    40                               im[0:H:2, 0:W:2, :],
    41                               im[1:H:2, 0:W:2, :]), axis=2)
    42     elif raw.raw_pattern[0,0] == 1 and raw.raw_pattern[0,1] == 0: # GRBG
    43         out = np.concatenate((im[0:H:2, 1:W:2, :],
    44                               im[0:H:2, 0:W:2, :],
    45                               im[1:H:2, 0:W:2, :],
    46                               im[1:H:2, 1:W:2, :]), axis=2)
    47     elif raw.raw_pattern[0,0] == 1 and raw.raw_pattern[0,1] == 2: # GBRG
    48         out = np.concatenate((im[1:H:2, 0:W:2, :],
    49                               im[0:H:2, 0:W:2, :],
    50                               im[0:H:2, 1:W:2, :],
    51                               im[1:H:2, 1:W:2, :]), axis=2)
    52     else:
    53         assert False
    54     # wb = np.array(raw.camera_whitebalance)
    55     # wb[3] = wb[1]
    56     # wb = wb / wb[1]
    57     # out = np.minimum(out * wb, 1.0)
    58     return out
    59 
    60 
    61 in_im = tf.placeholder(tf.float32, [1, bbf_h, bbf_w, 4], name='input')
    62 
    63 # Obtain the noise level map
    64 radius = 3
    65 strides = 32
    66 
    67 in_patches_g = tf.extract_image_patches(
    68     tf.expand_dims(
    69         in_im[:, :, :, 3], axis=3),
    70     (1, radius, radius, 1),
    71     (1, strides, strides, 1),
    72     (1, 1, 1, 1),
    73     'VALID')
    74 miu_g = tf.maximum(tf.reduce_mean(in_patches_g, axis=-1, keepdims=True), 1e-7)
    75 illu_level = tf.reduce_mean(miu_g)
    76 # sigma_g = tf.reduce_sum(tf.abs((in_patches_g - miu_g) / miu_g), axis=-1, keepdims=True)/(radius * radius - 1)
    77 sigma_g = tf.reduce_sum(tf.abs((in_patches_g - miu_g) / illu_level), axis=-1, keepdims=True)/(radius * radius - 1)
    78 
    79 sigma_level = tf.reduce_mean(sigma_g)
    80 print(in_patches_g.shape)
    81 
    82 sess = tf.Session()
    83 
    84 files = glob.glob('C:/Users/Administrator/Desktop/ILLU/*.dng')
    85 
    86 files.sort()
    87 for i in range(len(files)):
    88     sigma_, illu_ = sess.run([sigma_level, illu_level], feed_dict={in_im: np.expand_dims(pack_raw_bbf(files[i]), axis=0)})
    89     illu = 0.25 / sigma_
    90     print(illu)
  • 相关阅读:
    BZOJ2061 : Country
    BZOJ3591: 最长上升子序列
    BZOJ4356 : Ceoi2014 Wall
    BZOJ2159 : Crash 的文明世界
    BZOJ2149 : 拆迁队
    BZOJ2739 : 最远点
    BZOJ4068 : [Ctsc2015]app
    BZOJ4361 : isn
    BZOJ4404 : [Neerc2015]Binary vs Decimal
    BZOJ4402 : Claris的剑
  • 原文地址:https://www.cnblogs.com/thisisajoke/p/10412046.html
Copyright © 2020-2023  润新知