Hi I have a 2048 by 2048 matrix from X (pixels), Y(Binning), and Z(Intensity)-2D data. I want to modify this matrix (X, Pixel only) with a quadratic equation (for instance, 0.002*x^2-0.4*x+940) where x represents row number for rows (e.g. 300 to 500). The resultant matrix should be able to provide an image. Does anyone have idea or code to solve such type of problem in Igor? Will much appreciate the help.
It's not clear to me exactly what you are trying to accomplish. Do you want to distort the x-axis of an existing image so that NewX=0.002*OldX^2-0.4*OldX+940 or do you just want to create the image z=0.002*x^2-0.4*x+940?
If you are just trying to creating an image from an equation this little bit of code can get you started. Three windows are created on top of each other with three different images.
If you just want to display the image with the distorted x-axis you could plot the image using x- and y-waves, but if you want to continue working with the matrix you probably want to convert it to an evenly-spaced waveform format. You can do that with ImageInterpolate. I think there are several other options, but ImageInterpolate is the one I have previously used.
Function Test()Make/O/N=(2048, 2048) TestImage1=0Make/O/N=2049 XWave1, YWave1 // The x- and y-waves indicates the corners of the pixels and is therefore one point larger than the image
TestImage1[][]=sin(8*pi/2048*p)
XWave1[]=p-0.5
YWave1[]=p-0.5
XWave1[]=0.002*p^2+0.4*p+940// Has to be monotonically increasing or decreasing. I changed -0.4*p to +0.4*p to ensure thatDoWindow/K TestImageWindow1
Display/N=TestImageWindow1; AppendImage TestImage1 vs {XWave1, YWave1}// Converts the image to waveformVariable XStart=2000,XStep=1,XEnd=9000,YStart=500,YStep=1,YEnd=1500ImageInterpolate/DEST=TestImage2 /S={XStart,XStep,XEnd,YStart,YStep,YEnd}/W={XWave1, YWave1} XYWaves TestImage1
// Sets the x and y scaling of the new waveSetScale/Px, XStart, XStep, "", TestImage2
SetScale/Py, YStart, YStep, "", TestImage2
DoWindow/K TestImageWindow2
Display/N=TestImageWindow2; AppendImage TestImage2
end
Thanks a lot olelytken. You are right. I think displaying the image with the distorted x-axis, plotting the image using x- and y-waves would be better instead of working with matrix. If you don't mind posting for this as well, would highly appreciate.
The first half of my example show how to plot an image using x- and y-waves. Here it is again:
Function Test()Make/O/N=(2048, 2048) TestImage1=0Make/O/N=2049 XWave1, YWave1 // The x- and y-waves indicates the corners of the pixels and is therefore one point larger than the image
TestImage1[][]=sin(8*pi/2048*p)
XWave1[]=p-0.5
YWave1[]=p-0.5
XWave1[]=0.002*p^2+0.4*p+940// Has to be monotonically increasing or decreasing. I changed -0.4*p to +0.4*p to ensure thatDoWindow/K TestImageWindow1
Display/N=TestImageWindow1; AppendImage TestImage1 vs {XWave1, YWave1}end
The AppendImage TestImage1 vs {XWave1, YWave1} line is the important one. You can try AppendImage TestImage1 instead to compare the effect of the x- and y-waves.
If you are just trying to creating an image from an equation this little bit of code can get you started. Three windows are created on top of each other with three different images.
February 15, 2017 at 01:03 am - Permalink
I want to distort the x-axis of an existing image so that NewX=0.002*OldX^2-0.4*OldX+940. The Y and Z should remain the same.
February 15, 2017 at 08:34 am - Permalink
February 16, 2017 at 12:59 am - Permalink
February 16, 2017 at 04:47 pm - Permalink
The
AppendImage TestImage1 vs {XWave1, YWave1}
line is the important one. You can tryAppendImage TestImage1
instead to compare the effect of the x- and y-waves.February 17, 2017 at 12:28 am - Permalink
I tried both of the codes in my system. I am having trouble getting the result I wanted.
February 19, 2017 at 10:37 am - Permalink