偏光图像尝试——怎么了?

Polarizing image attempt--what's wrong?

我仍在编写一段代码来使图像偏光。它的逻辑似乎与方向一起工作,但是当我 运行 程序时,它不起作用(即颜色改变,但实际上没有偏振)。它也似乎有点长,因为我更愿意把所有的东西都写出来,这样我就可以清楚地看到正在做什么,但是有没有办法压缩它?

def polarize(im):
height=len(im)
width = len(im[0])
red = 0
green = 0
blue = 0
pixels = 0
for row in range(height):
    for col in range(width):
        red += im[row][col][0] #finds the sum of all red values
        green += im[row][col][1] #finds the sum of all green values
        blue += im[row][col][2] #finds the sum of all blue values
        pixels += 1
        avg_value_red = red/pixels
        avg_value_green = green/pixels
        avg_value_blue = blue/pixels
        if im[row][col][0] < avg_value_red:
                im[row][col][0] = 0
        elif im[row][col][0] > avg_value_red:
                im[row][col][0] = 255
        elif im[row][col][1] < avg_value_green:
                im[row][col][1] = 0
        elif im[row][col][1] > avg_value_green:
                im[row][col][1] = 255
        elif im[row][col][2] < avg_value_blue:
                im[row][col][2] = 0
        elif im[row][col][2] > avg_value_blue:
                im[row][col][2] = 255
return im

1) 在检查每个像素通道和设置值之前,您需要计算平均值。当前,您在读取每个新像素时正在更改 avg_value_red/avg_value_green/avg_value_blue,但这是一个移动平均值。平均颜色值应基于整个图像,而不仅仅是您迭代到该点的像素。

您可以将其分成两个单独的循环,然后在第一个循环而不是每次迭代后计算 的平均值。同样,pixels 只是您的 width 乘以您的 height,因此每次迭代都计算这个值没有什么价值。

2) 其次,您的 redgreenbluepixel 值是整数。在 Python 的某些版本中,当您执行 整数除法 时,您不会得到双倍。因此,当您计算 avg_value_red 等时,它可能 return 是一个整数值,而不是更精确的 float 或类似值。

3) 此外,您需要拆分条件以分别检查每个通道。比如发现im[row][col[0] < avg_value_red为真,满足一个条件,那么就不会检查蓝色和绿色通道。如果我们拆分这些条件,每个通道就会变成 if value > average, set channel to 255, else 0。所以没有理由检查是否value < average。您可以使用 ternary conditional operator 来执行此操作以保持代码简短,因为您已请求(但这取决于您)。

4) 最后,您还应该处理像素通道等于平均值​​的情况。目前这些值不会改变。 这当然取决于您的算法,但我希望它会以一种方式或另一种方式进行,而不是保持不变。

def polarize(im):
    height = len(im)
    width = len(im[0])
    red = 0
    green = 0
    blue = 0
    pixels = float(width*height)
    for row in range(height):
        for col in range(width):
            red += im[row][col][0] #finds the sum of all red values
            green += im[row][col][1] #finds the sum of all green values
            blue += im[row][col][2] #finds the sum of all blue values
    print numpy.mean(im, axis=(0,1))
    print red/pixels, green/pixels, blue/pixels
    avg_value_red = red/pixels
    avg_value_green = green/pixels
    avg_value_blue = blue/pixels
    for row in range(height):
        for col in range(width):
            im[row][col][0] = 255 if im[row][col][0] >= avg_value_red else 0
            im[row][col][1] = 255 if im[row][col][1] >= avg_value_green else 0
            im[row][col][2] = 255 if im[row][col][2] >= avg_value_blue else 0
    return im

5) 至于代码长度,它不会太长,但是有多种方法可以缩短 and/or 优化它,具体取决于您使用的 image/array 库。我假设这是 Numpy,在这种情况下,有多种方法可以改进它。例如,可以使用 Numpy 将整个方法压缩成一行:

def polarize(im):
    return (im[:,:]>=numpy.mean(im,axis=(0,1)))*255

这将检查每个通道是否大于或等于其平均值(在整个图像阵列中)。然后 truefalse 乘以 255(true*255 将得到 255false*255 将得到 0)。因此,对于每个像素的通道,最终结果的值为 2550。您可以将其分成多行以检查它在做什么。