我仍然在处理一段代码来极化图像。它的逻辑似乎与方向一致,但是当我运行程序时,它不起作用(即颜色改变,但实际上没有极化)。它似乎有点长,因为我更乐于写出所有内容,所以我可以清楚地看到正在做什么,但有没有办法压缩它?
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
答案 0 :(得分:2)
1)在检查每个像素通道和设置值 之前,您需要计算平均值。目前,当您阅读每个新像素时,您正在更改avg_value_red
/ avg_value_green
/ avg_value_blue
,但这是移动平均线。平均颜色值应该基于整个图像,而不仅仅是您在此之前迭代的像素。
你可以通过将它分成两个独立的循环,然后计算之后的第一个循环而不是每次迭代来计算平均值。同样,pixels
只是您的width
乘以height
,因此每次迭代计算此值几乎没有价值。
2)其次,您的red
,green
,blue
和pixel
值是整数。在某些版本的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
这将检查每个通道是否大于或等于其平均值(在整个图像阵列中)。然后,此true
或false
乘以255(true*255
将导致255
; false*255
将导致0
)。因此,对于每个像素的通道,最终结果具有255
或0
的值。你可以把它分成多行,以便检查它在做什么。