在numpy和tensorflow中进行高效的逐像素灰度测量

时间:2018-05-04 19:11:30

标签: python numpy tensorflow

我在目录中混合使用3通道灰度和彩色图像,我想在numpy中测量RGB图像实际上是多少经验灰度,并且可以非常有效地计算。

据我所知,如果R == G == B,我有一个灰度像素,如果每个像素的R,G,B不相等,我有一个彩色像素。我可以说灰度是灰度与彩色像素的比例。所有真实的灰度图像都应该得分== 1.

我制作了一个适用于PIL的愚蠢指标:

>>> from PIL import Image
>>> im = Image.open(filename)
>>> sum([1 for pixel in im.getdata() if (pixel[0]==pixel[1]==pixel[2])])/len(list(im.getdata()))

对于任意im == color:

0.0003056384175265294

对于im ==灰度:

1.0

所以这可以按预期工作。

正确播放此内容的正确方法是假设我从一个numpy数组或张量流张量开始而不是文件我可以访问PIL中的原始像素?

我从:

开始
sess = tf.Session()

dat = tf.read_file(filename)
ten = tf.image.decode_jpeg(dat)
x = sess.run(ten)

>>> x[0,0,:]
array([255, 255, 255], dtype=uint8)

看起来不错。我尝试了下面的内容,它似乎没有产生我想要的东西:

def grayscaler(x):
  """Input is a pixel.  Compare R == G == B"""
  if (x[0] == x[1] == x[2]):
    return 1
  else:
    return 0

>>> np.mean(np.apply_along_axis(grayscaler , axis=2, arr=x))

不幸的是,无论是图像,颜色还是灰度,我总是得到1,颜色或灰度,所以上面的函数不能正确翻译。

>>> np.mean(np.apply_along_axis(grayscaler, axis=2, arr=x))
1.0

对于numpy数组,以逐个像素的方式循环所有3个颜色通道的正确语法和功能是什么?

1 个答案:

答案 0 :(得分:2)

大胆思考,考虑张量。一个简单的想法是 1.计算灰度版本(穷人的方式) 2.从intput中减去灰度版本 3. L2距离

怎么样?
import tensorflow as tf
import numpy as np

fake_color = np.random.randn(8, 256, 256, 3).astype(np.float32)
fake_grayscale = np.random.randn(8, 256, 256, 3).mean(axis=3, keepdims=True).astype(np.float32)


def measure_grayscale(x):
    gray_version = tf.reduce_mean(x, axis=3, keepdims=True)
    difference = tf.reduce_mean(tf.squared_difference(x, gray_version), axis=[1, 2, 3])
    return difference


def regions_grayscale(x, tresh=0.1):
    gray_version = tf.reduce_mean(x, axis=3, keepdims=True)
    difference = tf.squared_difference(x, gray_version)
    return tf.greater(difference, tresh * tf.ones_like(difference))


with tf.Session() as sess:
    data = tf.placeholder(tf.float32)
    print sess.run(measure_grayscale(data), {data: fake_color})
    print sess.run(measure_grayscale(data), {data: fake_grayscale})

这里给出了:

  • [0.6701656 0.6660412 0.6667728 0.6642832 0.667957 0.66799116 0.6700557 0.66249603]批量彩色图像
  • [0。对于仅一批灰度图像
  • ,仅为0. 0。0. 0. 0 0. 0

根据您的启发式检测灰度级区域可以通过regions_grayscale中的阈值处理来完成。您甚至可以应用tf.reduce_mean(.., axis=1)来获取您的"愚蠢的指标"工作。

NumPy的语法是一样的。当您使用TensorFlow标签时,上面的代码使用的是TensorFlow。