|
BinaryFiller |
|
package ij.plugin.filter;
import ij.*;
import ij.process.*;
import ij.gui.*;
import java.awt.*;
/**Binary Fill (Process/Binary/Fill) by Gabriel Landini, G.Landini at bham.ac.uk. */
public class BinaryFiller implements PlugInFilter {
protected boolean backgroundIsZero;
public int setup(String arg, ImagePlus imp) {
if (imp==null)
{IJ.noImage(); return DONE;}
ImageStatistics stats=imp.getStatistics();
if (stats.histogram[0]+stats.histogram[255]!=stats.pixelCount){
IJ.error("8-bit binary image (0 and 255) required.");
return DONE;
}
backgroundIsZero = Prefs.blackBackground;
if (imp.isInvertedLut())
backgroundIsZero = !backgroundIsZero;
return IJ.setupDialog(imp, DOES_8G);
}
public void run(ImageProcessor ip) {
int xe = ip.getWidth();
int ye = ip.getHeight();
int x, y;
boolean b;
int [][] pixel = new int [xe][ye];
//original converted to white particles
if (!backgroundIsZero)
ip.invert();
//get original
for(y=0;y<ye;y++) {
for(x=0;x<xe;x++)
pixel[x][y]=ip.getPixel(x,y);
}
//label background borders
for (y=0; y<ye; y++){
if(ip.getPixel(0,y)==0)
ip.putPixel(0,y,127);
if(ip.getPixel(xe-1,y)==0)
ip.putPixel(xe-1,y,127);
}
for (x=0; x<xe; x++){
if(ip.getPixel(x,0)==0)
ip.putPixel(x,0,127);
if(ip.getPixel(x,ye-1)==0)
ip.putPixel(x,ye-1,127);
}
//flood background from borders
//the background of 8-connected particles is 4-connected
b=true;
while(b){
b=false;
for(y=1;y<ye-1;y++) {
for(x=1;x<xe-1;x++) {
if (ip.getPixel(x,y)==0){
if(ip.getPixel(x,y-1)==127 || ip.getPixel(x-1,y)==127) {
ip.putPixel(x,y,127);
b=true;
}
}
}
}
for(y=ye-2;y>=1;y--) {
for(x=xe-2;x>=1;x--) {
if (ip.getPixel(x,y)==0){
if(ip.getPixel(x+1,y)==127 || ip.getPixel(x,y+1)==127) {
ip.putPixel(x,y,127);
b=true;
}
}
}
}
}//idempotent
for(y=0;y<ye;y++) {
for(x=0;x<xe;x++){
if(ip.getPixel(x,y)==0)
ip.putPixel(x,y,255);
else
ip.putPixel(x,y,pixel[x][y]);
}
}
//return to original state
if (!backgroundIsZero)
ip.invert();
}
}
|
BinaryFiller |
|