/*N.Vischer 23.05.18 10:58 Macro for testing the quality loss caused by jpg compression. - An 8-bit test image containig concentric rings with varying intensites is created, - A copy is saved as JPG and reloaded, - distances between minima along radial profiles are measured - Values before and after compression are shown in a table - Measurements are performed on copies that are scaled-up by factor 10 (after JPG conversion!), to get a resolution of 0.1 pixels. */ var factor = 10, //expansion for sub-pixel precision, default = 10 lineWidth = 4,//for measuring profiles, default = 4 interval = 15,//ring-to-ring distance, default = 15 pixels jpegQuality = 75,//default = 75% maxContrast = false,//default = false picSize = 400, xc = picSize/2, yc = xc, macro "Create Circles [1]"{ random("seed", 0); intervalsTIF = newArray(9999); intervalsJPG = newArray(9999); roiManager("reset"); close("Circles*"); newImage("Circles.tif", "8-bit white", xc*2, yc*2, 1); id = getImageID; for(rad = 4 * interval; rad 0){ iv = (minLocs[jj] - minLocs[jj-1])/factor; iv = d2s(iv, 1);//1 digit if(loop==1) intervalsTIF[ptr2++] = iv; if(loop==2) intervalsJPG[ptr3++] = iv; } } } close; xx = Array.trim(xx, ptr1); yy = Array.trim(yy, ptr1); if(loop == 1) selectImage("Circles.tif"); if(loop == 2) selectImage("Circles.jpg"); for(jj = 0; jj < ptr1; jj++){ makePoint(xx[jj]/factor, yy[jj]/factor); run("Add Selection..."); } } intervalsTIF = Array.trim(intervalsTIF, ptr2); intervalsJPG = Array.trim(intervalsJPG, ptr3); Array.show(intervalsTIF, intervalsJPG); Array.getStatistics(intervalsTIF, minT, maxT, mean, stdDev1); Array.getStatistics(intervalsJPG, minJ, maxJ, mean, stdDev2); print("\\Clear"); size = File.length(jpgPath); print("JPG Quality: ", jpegQuality); print("Image size (K): ", d2s(picSize * picSize/1024, 1)); print("JPG File size (K): ", d2s(size/1024, 1)); print("Max Contrast Flag: ", maxContrast); print("Nominal Interval = " + interval + " pixels"); print("\nintervalsTIF: StdDev = " + stdDev1 + " pixels"); print("intervalsJPG: StdDev = " + stdDev2 + " pixels"); print("\nRange TIF: = " + minT + " - " + maxT + " pixels"); print("Range JPG: = " + minJ + " - " + maxJ + " pixels"); selectWindow("Log"); run("Input/Output...", "jpeg=75"); }