Iterative extraction of xy coordinates of a given pixel value from image

Hello all,

I have TIFF images with 1 pixel thick lines on them which have unique value. I am trying to extract the xy coordinates of each value and fit a line to them and store the results of the fit. I need to do this iteratively, for each unique value and for hundreds of images. I have written a procedure that loads the TIFF and then calls another function (which is shown below).

My problem: it works for the first iteration, but then fails on subsequent iterations. I can't figure out what is wrong. The debugger shows on the second loop the conditional wave assignment results in all NaN waves. I can't figure out why. The value is present in the image. I've tried rounding to ensure that 2 is an integer and not 2.000001 or something.

Can anybody help? Please feel free to tell me if there is a simpler/faster way to extract the coordinates!


Function Extractor(m0)
	Wave m0
	
	ImageStats m0
	NVAR /Z nZ = fileIndex	// global variable
	Variable lastMT = V_max
	String wName
	DoWindow/K allPlot
	Display /N=allPlot
	
	Variable i
	
	for(i = 1; i < (lastMT + 1); i += 1) // MT, 1-based
		Duplicate/O m0, tempXw
		Duplicate/O m0, tempYw
		tempXw = (m0 == i) ? p : NaN
		tempYw = (m0 == i) ? q : NaN
		Redimension/N=(V_npnts) tempXw,tempYw
		WaveTransform zapnans tempXw
		WaveTransform zapnans tempYw
		Print i, ":", numpnts(tempXw) // for debugging
		if(numpnts(tempXw) > 2)
			CurveFit/Q/NTHR=0 line tempYw /X=tempXw /D
			WAVE /Z fit_tempYw // calling inside loop in case this is the problem
			wName = "vec_" + num2str(nZ) + "_" + num2str(i)
			Make/O/N=(2,2) $wName
			Wave m1 = $wName
			m1[0][0] = leftx(fit_tempYw)
			m1[1][0] = rightx(fit_tempYw)
			m1[0][1] = fit_tempYw[0]
			m1[1][1] = fit_tempYw[1]
			AppendToGraph/W=allPlot m1[][1] vs m1[][0] // for debugging
		endif
		KillWaves tempXw,tempYw,fit_tempYw // added this but it doesn't help
	endfor
	
//	KillWaves m0,tempXw,tempYw,tempfitw
	
End


Edit: if I remove the if-endif code the first part of the loop (conditional asssignments) runs OK.
Edit2: if I comment out the CurveFit, function runs OK.

Problem solved! I put the curve fit in a separate function and this solved the problem. Picked up that tip here: http://www.igorexchange.com/node/628 no idea why it works.

I'll leave this here in case it helps anyone or if anyone has a better idea to pull the co-ordinates out. On a 768 * 768 image with 16 values it takes less than a second, which hopefully will be OK when I process all the images.
Presumably m0 is a 2D matrix. Wave assignments with more than a single dimension should explicitly use [] notation on the RHS, like:

		tempXw = (m0[p][q] == i) ? p : NaN
		tempYw = (m0[p][q] == i) ? q : NaN

But I would think that would cause problems with the first iteration as well.

John Weeks
WaveMetrics, Inc.
support@wavemetrics.com