Squiz Matrix  4.12.2
 All Data Structures Namespaces Functions Variables Pages
BinaryFiller.java
1 package ij.plugin.filter;
2 import ij.*;
3 import ij.process.*;
4 import ij.gui.*;
5 import java.awt.*;
6 
8 public class BinaryFiller implements PlugInFilter {
9  protected boolean backgroundIsZero;
10 
11  public int setup(String arg, ImagePlus imp) {
12  if (imp==null)
13  {IJ.noImage(); return DONE;}
14  ImageStatistics stats=imp.getStatistics();
15  if (stats.histogram[0]+stats.histogram[255]!=stats.pixelCount){
16  IJ.error("8-bit binary image (0 and 255) required.");
17  return DONE;
18  }
19  backgroundIsZero = Binary.blackBackground;
20  if (imp.isInvertedLut())
21  backgroundIsZero = !backgroundIsZero;
22  return IJ.setupDialog(imp, DOES_8G);
23  }
24 
25  public void run(ImageProcessor ip) {
26  int xe = ip.getWidth();
27  int ye = ip.getHeight();
28  int x, y;
29  boolean b;
30  int [][] pixel = new int [xe][ye];
31 
32  //original converted to white particles
33  if (!backgroundIsZero)
34  ip.invert();
35 
36  //get original
37  for(y=0;y<ye;y++) {
38  for(x=0;x<xe;x++)
39  pixel[x][y]=ip.getPixel(x,y);
40  }
41 
42  //label background borders
43  for (y=0; y<ye; y++){
44  if(ip.getPixel(0,y)==0)
45  ip.putPixel(0,y,127);
46  if(ip.getPixel(xe-1,y)==0)
47  ip.putPixel(xe-1,y,127);
48  }
49 
50  for (x=0; x<xe; x++){
51  if(ip.getPixel(x,0)==0)
52  ip.putPixel(x,0,127);
53  if(ip.getPixel(x,ye-1)==0)
54  ip.putPixel(x,ye-1,127);
55  }
56 
57  //flood background from borders
58  //the background of 8-connected particles is 4-connected
59  b=true;
60  while(b){
61  b=false;
62  for(y=1;y<ye-1;y++) {
63  for(x=1;x<xe-1;x++) {
64  if (ip.getPixel(x,y)==0){
65  if(ip.getPixel(x,y-1)==127 || ip.getPixel(x-1,y)==127) {
66  ip.putPixel(x,y,127);
67  b=true;
68  }
69  }
70  }
71  }
72  for(y=ye-2;y>=1;y--) {
73  for(x=xe-2;x>=1;x--) {
74  if (ip.getPixel(x,y)==0){
75  if(ip.getPixel(x+1,y)==127 || ip.getPixel(x,y+1)==127) {
76  ip.putPixel(x,y,127);
77  b=true;
78  }
79  }
80  }
81  }
82  }//idempotent
83 
84  for(y=0;y<ye;y++) {
85  for(x=0;x<xe;x++){
86  if(ip.getPixel(x,y)==0)
87  ip.putPixel(x,y,255);
88  else
89  ip.putPixel(x,y,pixel[x][y]);
90  }
91  }
92 
93  //return to original state
94  if (!backgroundIsZero)
95  ip.invert();
96  }
97 
98 }