【发布时间】:2018-09-24 15:24:54
【问题描述】:
我对上一个问题进行了搜索,但没有找到优化代码所需的内容。
关于信息,我在 Python 2.7 上运行,但如果需要可以更改为 3
我正在转换图像的每个像素,由于某些条件,我必须逐个像素地进行转换。 所以我在里面嵌套了一个 if-elif-else 语句的 for 循环,它需要很长时间才能运行。 对于 1536 x 2640 的图像,整个代码大约需要 20 秒,90% 的时间都在这个双 for 循环中
我相信应该有更好的方法来编写下面的代码
for pixel in range(width):
for row in range(height):
ADC = img_original[row, pixel]
if ADC < 84:
gain = gain1
offset = offset1
elif ADC > 153:
gain = gain3
offset = offset3
else:
gain = gain2
offset = offset2
Conv_ADC = int(min(max(ADC * gain + offset, 0),255))
img_conv[row, pixel] = Conv_ADC
感谢您的帮助
编辑以获取更多详细信息:
@Jean-FrançoisFabre 是对的,我根据我在 0 到 255 之间的哪个部分应用三种不同的增益/偏移量。但该部分并不总是均匀的空间,可以修改。 也许为了提供一些额外的上下文,我只是将自定义 S 曲线应用于图像以向上/向下移动像素值。并且图像中的每一列都有自己的S曲线
我的 gain1,2,3/offset1,2,3 值是浮点数。增益将始终为正,偏移量可以为负或正。我在宽度方向上也为每个像素设置了一个单独的值,但它们在行方向上是通用的。
例如,第 1 列中的所有像素都可以使用下表中第一行的增益/偏移 1、2、3。图像中第 2 列的所有像素将使用下表第 2 行的增益/偏移量
Pixel Gain1 Offset1 Gain2 Offset2 Gain3 Offset3
1 0.417722 24.911392 0.623188 7.652176 1.175676 -76.878357
2 0.43038 25.848103 0.623188 9.652176 1.148649 -70.743225
3 0.443038 23.784809 0.637681 7.434776 1.175676 -74.878357
4 0.443038 22.784809 0.652174 5.217384 1.175676 -74.878357
5 0.455696 23.721519 0.637681 8.434776 1.202703 -78.013519
6 0.455696 21.721519 0.637681 6.434776 1.243243 -86.216217
7 0.455696 22.721519 0.623188 8.652176 1.216216 -82.081085
8 0.443038 22.784809 0.623188 7.652176 1.22973 -85.148651
... until pixel 2640 in width direction
我会看看@Jean-FrançoisFabre 解决方案,但同时我也在考虑使用一些 numpy 方法。
一旦我得到计算速度更快的东西,我会在这里发布我的发现
【问题讨论】:
-
我想你会想看看
numpy.where()的矢量化方法,但我们看不到数据 -
问题可能不是
if-elif-statement,而是for循环。如果您在循环中花费大量时间,那是因为您的代码很慢。我支持@roganjosh 使用矢量化方法。 -
您可以使用多处理将工作负载拆分为像素网格的较小部分。这样,如果需要像您一样循环遍历像素,它可以使完成速度更快。
-
现在在电脑上。你能提供一个我可以测试的有代表性的输入和输出吗?
标签: python python-2.7 if-statement optimization