//Smooth Wand version 1d //N.Vischer //01.07.17 20:20 var count, polyX, polyY getSelectionBounds(x, y, w, h); if (w<2 || h<2) exit("Width and height must be > 1 px"); if (selectionType != 4) exit("No traced selection found"); getThreshold(lowThr, hiThr); getSelectionCoordinates(xx, yy); len = xx.length; polyX = newArray(len); polyY = newArray(len); count = 0; for(jj = 0; jj < len; jj++) { x1 = xx[jj]; y1 = yy[jj]; x2 = xx[(jj+1)%len]; y2 = yy[(jj+1)%len]; dd = 1; if (y1 == y2) {//horizontal separator if (x1 > x2) dd = -1; for(x = x1; x != x2; x+= dd){ processPixelPair(x, y1, x+dd, y1); } } else {//vertical separator if (y1 > y2) dd = -1; for(y = y1; y != y2; y+= dd){ processPixelPair(x1, y, x1, y+dd); } } } polyX = Array.trim(polyX, count); polyY = Array.trim(polyY, count); makeSelection("polygon", polyX, polyY); run("Interpolate", "interval=1 adjust"); //after button released //processes neighbors of this separator line and adds vertex function processPixelPair(x1, y1, x2, y2) { if (x1 == x2) { val1 = getPixel(x1, minOf(y1, y2)); val2 = getPixel(x1 - 1, minOf(y1, y2)); } if (y1 == y2){ val1 = getPixel(minOf(x1, x2), y1); val2 = getPixel(minOf(x1, x2), y1 -1); } bright = maxOf(val1, val2); dark = minOf(val1, val2); if (bright>=lowThr && dark<=lowThr) thr = lowThr; if (bright>=hiThr && dark<=hiThr) thr = hiThr; if (dark==bright) fraction = 0.5; else fraction = (thr - dark)/(bright - dark); if (val1 < val2) fraction = 1 - fraction; if (y1 == y2) { newY = minOf(y1, y2) + fraction - 0.5; newX = (x1 + x2)/2; } if (x1 == x2) { newX = minOf(x1, x2) + fraction - 0.5; newY = (y1 + y2)/2; } polyX[count] = newX; polyY[count] = newY; count++; if (count == polyX.length){ polyX = Array.concat(polyX, polyX); polyY = Array.concat(polyY, polyY); } }