Standard deviation in ROI of image

Hello all,

I am calculating signal to noise ratio of spots in a bunch of images. I am specifying the ROI for the signal and an ROI for the noise using a mask wave where 0 is outside the ROI and 1 is inside.

Calculating the mean can be done using a nice one-liner from AG that I found in another thread. I'm curious if there is a similar one line MatrixOp for getting the standard deviation.

Here is my current code:

// snip
		m0 = 0 // m0 is mask wave for signal ROI
		MakeMaskMean(m0,xx,yy) // external function
		MatrixOP/O aa = sum(m0 * imgMat) / sum(m0) // calculates the mean
		qW[i][0] = aa[0]
		m1 = 0 // m1 is mask wave for noise ROI
		MakeMaskSD(m1,xx,yy) // external function
		MatrixOP/O bb = sum(m1 * imgMat) / sum(m1) // get mean
		Duplicate/O/FREE imgMat,m2
		m2 -=bb[0] // subtract mean from image
		m2[][] *=m1[p][q] // apply the mask
		MatrixOP/O cc = sqrt(sum(m2 * m2) / sum(m1)) // calculate SD
		qW[i][1] = cc[0]
// snip

Getting SD is 5 lines and I wonder if it would be faster to push the values in the ROI to a 1D wave and do WaveStats, or if there is some MatrixOP magic I am missing.
Thanks for any help.

Curious why use Matrixop instead of Imagestats?

Imagestats returns average and standard deviation and takes an ROI mask all in one line.

Andy
Argh I did not realise that ImageStats took an ROI wave. Thank you!!

First let's take a look at how you could change your code snippet:


		m0 = 0 // m0 is mask wave for signal ROI
		MakeMaskMean(m0,xx,yy) // external function
		MatrixOP/O aa = sum(m0 * imgMat) / sum(m0) // calculates the mean
		qW[i][0] = aa[0]
		m1 = 0 // m1 is mask wave for noise ROI
		MakeMaskSD(m1,xx,yy) // external function
		MatrixOP/O bb = sum(m1 * imgMat) / sum(m1) // get mean
		Variable bb0=bb[0]
		// There is no need to waste time on this duplication; MatrixOP takes care of it:
		// Duplicate/O/FREE imgMat,m2
		// m2 -=bb[0] // subtract mean from image
		// m2[][] *=m1[p][q] // apply the mask
		// MatrixOP/O cc = sqrt(sum(m2 * m2) / sum(m1)) // calculate SD
		MatrixOP/O cc=sqrt(sum(magsqr((imgMat-bb0)*m1))/sum(m1))
		qW[i][1] = cc[0]


In practice, depending on the size of your images and ROI's, ImageStats may be more efficient because in IP7 ImageStats is automatically multithreaded.

Also note that when you work with ROI in MatrixOP, included pixels correspond to a value of 1 in the mask while ImageStats requires that included pixels are marked by 0 in the ROI wave.


A.G.
WaveMetrics, Inc.
I am now using ImageStats for this, but thank you for the input into my code. I learned two new tricks there. How to subtract a constant in MatrixOP and also the magsqr command. I'm not sure which approach would be faster, the ROIs I am using are small: tens of pixels.

Thanks!