我在目录中混合使用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个颜色通道的正确语法和功能是什么?
答案 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})
这里给出了:
根据您的启发式检测灰度级区域可以通过regions_grayscale
中的阈值处理来完成。您甚至可以应用tf.reduce_mean(.., axis=1)
来获取您的"愚蠢的指标"工作。
NumPy的语法是一样的。当您使用TensorFlow标签时,上面的代码使用的是TensorFlow。