所以我有一个数组(它很大 - 2048x2048),我想根据它们的位置做一些元素明智的操作。我很困惑如何做到这一点(我被告知不要使用for循环,当我尝试我的IDE冻结,它真的很慢)。
问题:
h = aperatureimage
h[:,:] = 0
indices = np.where(aperatureimage>1)
for True in h:
h[index] = np.exp(1j*k*z)*np.exp(1j*k*(x**2+y**2)/(2*z))/(1j*wave*z)
所以我有一个索引,这是(我假设在这里)基本上是我的较大的aperatureimage数组的“裁剪”版本。 *注意:Aperature图像是一个转换为数组的灰度图像,它上面有一个形状或文字,我想找到所有的“白色”区域并执行我的操作。
如何访问索引的各个x / y值,这将允许我执行指数运算?当我尝试索引[:,None]时,导致程序吐出'ValueError:广播尺寸太大'。我也得到阵列不能播放到正确的形状。任何帮助将不胜感激!
还有一个澄清:x和y是我想要改变的唯一值(基本上是我的数组中有白色,z,k以及之前定义的其他任何值的点)。
编辑:
我不确定上面发布的代码是否正确,它返回两个空数组。当我这样做的时候 index =(aperatureimage == 1) print len(index)
实际上,到目前为止我所做的一切都没有正常工作。我有一个2048x2048的图像,中间有一个128x128的白色方块。我想将此图像转换为数组,查看所有值并确定数组不是黑色的索引值(x,y)(我只有白/黑,双层图像对我不起作用)。然后我想获取数组不为0的所有值(x,y),并将它们乘以上面列出的h [index]值。
如有必要,我可以发布更多信息。如果你不知道,我就被困住了。
EDIT2:这里有一些可能有用的代码 - 我想我已经解决了上面的问题(我现在可以访问数组的成员并对它们执行操作)。但是 - 由于某种原因,我的for循环中的Fx值永远不会增加,它会永远循环Fy ....
import sys, os
from scipy.signal import *
import numpy as np
import Image, ImageDraw, ImageFont, ImageOps, ImageEnhance, ImageColor
def createImage(aperature, type):
imsize = aperature*8
middle = imsize/2
im = Image.new("L", (imsize,imsize))
draw = ImageDraw.Draw(im)
box = ((middle-aperature/2, middle-aperature/2), (middle+aperature/2, middle+aperature/2))
import sys, os
from scipy.signal import *
import numpy as np
import Image, ImageDraw, ImageFont, ImageOps, ImageEnhance, ImageColor
def createImage(aperature, type):
imsize = aperature*8 #Add 0 padding to make it nice
middle = imsize/2 # The middle (physical 0) of our image will be the imagesize/2
im = Image.new("L", (imsize,imsize)) #Make a grayscale image with imsize*imsize pixels
draw = ImageDraw.Draw(im) #Create a new draw method
box = ((middle-aperature/2, middle-aperature/2), (middle+aperature/2, middle+aperature/2)) #Bounding box for aperature
if type == 'Rectangle':
draw.rectangle(box, fill = 'white') #Draw rectangle in the box and color it white
del draw
return im, middle
def Diffraction(aperaturediameter = 1, type = 'Rectangle', z = 2000000, wave = .001):
# Constants
deltaF = 1/8 # Image will be 8mm wide
z = 1/3.
wave = 0.001
k = 2*pi/wave
# Now let's get to work
aperature = aperaturediameter * 128 # Aperaturediameter (in mm) to some pixels
im, middle = createImage(aperature, type) #Create an image depending on type of aperature
aperaturearray = np.array(im) # Turn image into numpy array
# Fourier Transform of Aperature
Ta = np.fft.fftshift(np.fft.fft2(aperaturearray))/(len(aperaturearray))
# Transforming and calculating of Transfer Function Method
H = aperaturearray.copy() # Copy image so H (transfer function) has the same dimensions as aperaturearray
H[:,:] = 0 # Set H to 0
U = aperaturearray.copy()
U[:,:] = 0
index = np.nonzero(aperaturearray) # Find nonzero elements of aperaturearray
H[index[0],index[1]] = np.exp(1j*k*z)*np.exp(-1j*k*wave*z*((index[0]-middle)**2+(index[1]-middle)**2)) # Free space transfer for ap array
Utfm = abs(np.fft.fftshift(np.fft.ifft2(Ta*H))) # Compute intensity at distance z
# Fourier Integral Method
apindex = np.nonzero(aperaturearray)
U[index[0],index[1]] = aperaturearray[index[0],index[1]] * np.exp(1j*k*((index[0]-middle)**2+(index[1]-middle)**2)/(2*z))
Ufim = abs(np.fft.fftshift(np.fft.fft2(U))/len(U))
# Save image
fim = Image.fromarray(np.uint8(Ufim))
fim.save("PATH\Fim.jpg")
ftfm = Image.fromarray(np.uint8(Utfm))
ftfm.save("PATH\FTFM.jpg")
print "that may have worked..."
return
if __name__ == '__main__':
Diffraction()
你需要numpy,scipy和PIL才能使用这段代码。
当我运行它时,它会通过代码,但它们中没有数据(一切都是黑色的)。现在我有一个真正的问题,因为我不完全理解我正在做的数学(这是用于HW),而且我没有牢固掌握Python。
U[index[0],index[1]] = aperaturearray[index[0],index[1]] * np.exp(1j*k*((index[0]-middle)**2+(index[1]-middle)**2)/(2*z))
该行是否适用于对我的阵列执行元素计算?
答案 0 :(得分:2)
您是否可以发布一个最小但完整的示例?我们可以复制/粘贴并运行自己的一个吗?
与此同时,在当前示例的前两行中:
h = aperatureimage
h[:,:] = 0
你将'aperatureimage'和'h'都设置为0.这可能不是你想要的。您可能需要考虑:
h = aperatureimage.copy()
这会生成一个aperatureimage副本,而你的代码只是将h指向与aperatureimage相同的数组。因此改变另一个会改变另一个。 请注意,复制非常大的阵列可能会花费您更多的内存,而不是您希望的。
我认为你要做的是:
import numpy as np
N = 2048
M = 64
a = np.zeros((N, N))
a[N/2-M:N/2+M,N/2-M:N/2+M]=1
x,y = np.meshgrid(np.linspace(0, 1, N), np.linspace(0, 1, N))
b = a.copy()
indices = np.where(a>0)
b[indices] = np.exp(x[indices]**2+y[indices]**2)
或类似的东西。在任何情况下,这都会根据x / y坐标在'b'中设置一些值,其中'a'大于0.尝试使用imshow进行可视化。祝你好运!
您应该对输出进行标准化,使其适合8位整数。目前,您的一个数组的最大值远大于255,而另一个数组的最大值则小得多。试试这个:
fim = Image.fromarray(np.uint8(255*Ufim/np.amax(Ufim)))
fim.save("PATH\Fim.jpg")
ftfm = Image.fromarray(np.uint8(255*Utfm/np.amax(Utfm)))
ftfm.save("PATH\FTFM.jpg")
还要考虑np.zeros_like()而不是复制和清除H和U。
最后,我个人非常喜欢在开发这样的东西时使用ipython。如果您将Diffraction函数中的代码放在脚本的顶层(代替'if __ name __& c。'),那么您可以直接从ipython访问变量。像np.amax(Utfm)这样的快速命令会告诉你确实有值!= 0。 imshow()总是很好看看矩阵。