def pca_ii(ori_image):
# Resize particular size
ori_image = tf.stack(ori_image) # if dim 3 -> 4
ori_image = tf.expand_dims(ori_image, [0])
ori_image = tf.cast(ori_image, tf.float32)
ori_image += 1.0 # Prevent zero divide
# Extract uniform k sample
ksizes = [1, 1, 1, 1] # 1x1 pixel
strides = [1, 10, 10, 1] # 4
rates = [1, 1, 1, 1]
sample_pixel = tf.extract_image_patches(ori_image, ksizes, strides, rates, padding='VALID')
sample_pixel = tf.squeeze(sample_pixel, [0])
num_sample = sample_pixel.get_shape()[0].value * sample_pixel.get_shape()[1].value
sample_pixel = tf.reshape(sample_pixel, [num_sample, 1, 1, 3])
pixel_R = sample_pixel[:,0,0,0]
pixel_G = sample_pixel[:,0,0,1]
pixel_B = sample_pixel[:,0,0,2]
geoM = tf.pow(pixel_R * pixel_G * pixel_B, 1.0/3.0)
ch_r = tf.reshape(tf.log(pixel_R / geoM), [1, num_sample])
ch_b = tf.reshape(tf.log(pixel_B / geoM), [1, num_sample])
X = tf.concat([ch_r, ch_b], 0)
[U, S, V] = tf.svd(X)
vec = S[:,0]
alpha = tf.abs(tf.atan(-vec[0] / vec[1]))
tmp = tf.squeeze(ori_image, [0])
pixel_R = tmp[:,:,0]
pixel_G = tmp[:,:,1]
pixel_B = tmp[:,:,2]
geoM = tf.pow(pixel_R * pixel_G * pixel_B, 1.0/3.0)
num_pixel = ori_image.get_shape()[1].value * ori_image.get_shape()[2].value
ch_r = tf.log(pixel_R / geoM)
ch_b = tf.log(pixel_B / geoM)
ii_image = ch_r * tf.cos(alpha) + ch_b * tf.sin(alpha)
return ii_image, alpha
评论列表
文章目录