偏光图像尝试——怎么了?
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) 其次,您的 red
、green
、blue
和 pixel
值是整数。在 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
这将检查每个通道是否大于或等于其平均值(在整个图像阵列中)。然后 true
或 false
乘以 255(true*255
将得到 255
;false*255
将得到 0
)。因此,对于每个像素的通道,最终结果的值为 255
或 0
。您可以将其分成多行以检查它在做什么。
我仍在编写一段代码来使图像偏光。它的逻辑似乎与方向一起工作,但是当我 运行 程序时,它不起作用(即颜色改变,但实际上没有偏振)。它也似乎有点长,因为我更愿意把所有的东西都写出来,这样我就可以清楚地看到正在做什么,但是有没有办法压缩它?
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) 其次,您的 red
、green
、blue
和 pixel
值是整数。在 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
这将检查每个通道是否大于或等于其平均值(在整个图像阵列中)。然后 true
或 false
乘以 255(true*255
将得到 255
;false*255
将得到 0
)。因此,对于每个像素的通道,最终结果的值为 255
或 0
。您可以将其分成多行以检查它在做什么。