极化图像尝试 - 出了什么问题?

时间:2015-03-22 01:14:03

标签: python image-processing rgb

我仍然在处理一段代码来极化图像。它的逻辑似乎与方向一致,但是当我运行程序时,它不起作用(即颜色改变,但实际上没有极化)。它似乎有点长,因为我更乐于写出所有内容,所以我可以清楚地看到正在做什么,但有没有办法压缩它?

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 个答案:

答案 0 :(得分:2)

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

你可以通过将它分成两个独立的循环,然后计算之后的第一个循环而不是每次迭代来计算平均值。同样,pixels只是您的width乘以height,因此每次迭代计算此值几乎没有价值。

2)其次,您的redgreenbluepixel值是整数。在某些版本的Python中,当你执行整数除法时,你不会得到一个双精度。因此,当您计算avg_value_red等时,它可能会返回一个整数值,而不是更精确的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)至于代码长度,它不会太长,但根据您使用的图像/阵列库,有多种方法可以缩短和/或优化它。我认为这是 Numpy ,在这种情况下,有多种方法可以改善这一点。例如,可以使用Numpy:

将整个方法压缩为一行
def polarize(im):
    return (im[:,:]>=numpy.mean(im,axis=(0,1)))*255

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