adaptive_median Namespace Reference


Functions

def process
def demo
def main


Function Documentation

def adaptive_median::demo (   target_array,
  array_length 
)

Definition at line 101 of file adaptive_median.py.

00101                                     :
00102 
00103     sorted = sort(target_array)
00104     median = sorted[array_length/2]
00105     return median
00106 
def main(argv):

def adaptive_median::main (   argv  ) 

Definition at line 107 of file adaptive_median.py.

00107               :
00108 
00109     import os, getopt, sys, Image
00110     import timing
00111 
00112     global filename
00113 
00114     ## Do the right thing with boolean values for all known Python versions.
00115     try:
00116         True, False
00117     except NameError:
00118         (True, False) = (1, 0)
00119 
00120     try:
00121         args, filenames = getopt.getopt(argv[1:], "hvwt", ["help", "verbose", "window=", "threshold="])
00122     except getopt.error, msg:
00123         args = "dummy"
00124         print msg
00125         print "Usage: %s [-h|v|--window=[1..5]|--threshold=[0..N]] <filename>" % (argv[0],)
00126         print "Demonstrates adaptive median filtering on gray-scale images."
00127         sys.exit(2)
00128 
00129     # Obligatory spam variable; controls verbosity of the output
00130     spam = False
00131     
00132     # window = ws, where the filter window W = 2*ws + 1, 
00133     # ie, ws = 1 is a 3x3 window (W=3)
00134     window = 1
00135     threshold = 0.
00136 
00137     for o, a in args:
00138         if o in ("-h", "--help"):
00139             print __doc__
00140             sys.exit(0)
00141         if o in ("-v", "--verbose"):
00142             spam = True
00143     if spam:
00144         print "options =", args
00145         print "filenames =", filenames
00146 
00147     try:
00148         for o in args[:]:
00149             if o[0] == '--threshold' and o[1] != '':
00150                 threshold = float(o[1])
00151                 args.remove(o)
00152                 break
00153             elif o[0] == '--threshold' and o[1] == '':
00154                 print "The --threshold option requires an argument."
00155                 sys.exit(2)
00156         for o in args[:]:
00157             if o[0] == '--window' and o[1] != '':
00158                 window = int(o[1])
00159                 args.remove(o)
00160                 break
00161             elif o[0] == '--window' and o[1] == '':
00162                 print "The --window option requires an argument."
00163                 sys.exit(2)
00164     except ValueError:
00165         print "Incompatible parameter", o[1],".", " Option must be a number."
00166         sys.stderr.write
00167         sys.exit(2)
00168     except TypeError, err:
00169         print "Parameter error:", err
00170         sys.exit(2)
00171 
00172     if threshold < 0.:
00173         print "The threshold must be a non-negative real value (default=0)."
00174         sys.exit(2)
00175 
00176     if not (1 <= window <= 5):
00177         print "The window size must be an integer between 1 and 5 (default=1)."
00178         sys.exit(2)
00179     
00180     if not filenames:
00181         print "Please specify one or more gray-scale input files."
00182 
00183     if spam:
00184         print "window =", window
00185         print "threshold =", threshold
00186 
00187     image_count = 0
00188     filter_time = 0.
00189 
00190     for filename in filenames:
00191         try:
00192             infile = open(filename, "rb")
00193         except IOError, err:
00194             print "Input file error:", err
00195             if spam:
00196                 print "Please check the name(s) of your input file(s)."
00197             os.close(sys.stderr.fileno())
00198             sys.exit(2)
00199 
00200         try:
00201             pil_image = Image.open(infile)
00202             if pil_image.mode == 'P':
00203                 if spam:
00204                     print "Original image mode: ",pil_image.mode
00205                 pil_image = pil_image.convert("L")
00206         except IOError:
00207             print "Cannot parse input image format.", pil_image
00208         if spam:
00209             print "Input image format: ", pil_image.format
00210             print "Input image size: ", pil_image.size
00211             print "Working image mode: ",pil_image.mode
00212 
00213         ## Convert the PIL image object to a sequence (list)
00214         input_sequence = list(pil_image.getdata())
00215 
00216         try:
00217             timing.start()
00218             ## filter input image sequence
00219             output_sequence = process(input_sequence, pil_image.size, window, threshold, spam)
00220             timing.finish()
00221             filter_time = filter_time + float(timing.micro()) / 1000000
00222 
00223             ## init output image
00224             file, ext = os.path.splitext(filename)
00225             outfile = "new_" + file + ext
00226             try:
00227                 output_image = Image.new(pil_image.mode, pil_image.size, None)
00228                 output_image.putdata(output_sequence)
00229                 output_image.save(outfile, pil_image.format)
00230                 if spam:
00231                     print "Output image name: ", outfile
00232 
00233             except IOError, err:
00234                 print "Output file error:", err
00235                 if spam:
00236                     print "Cannot create output image for ", input_image, "."
00237                     print "  Continuing with next available file..."
00238                 continue
00239 
00240         except MemoryError, err:
00241             sys.stderr.write(err)
00242             if spam:
00243                 print "Not enough memory to create output image for ", input_image, "."
00244                 print "  Continuing with next available file..."
00245             continue
00246 
00247         infile.close()
00248         image_count += 1
00249 
00250     print image_count, "image(s) filtered in", filter_time, "seconds."
00251 
if __name__ == "__main__":

def adaptive_median::process (   image,
  size,
  window,
  threshold,
  spam 
)

Definition at line 52 of file adaptive_median.py.

00052                                                  :
00053 
00054     ## set filter window and image dimensions
00055     W = 2*window + 1
00056     xlength, ylength = size
00057     vlength = W*W
00058     if spam:
00059         print "Image length in X direction:", xlength
00060         print "Image length in Y direction:", ylength
00061         print "Filter window size:", W, "x", W
00062 
00063     ## create 2-D image array and initialize window
00064     image_array = reshape(array(image, type=UInt8), (ylength,xlength))
00065     filter_window = zeros((W,W))
00066     pixel_count = 0
00067 
00068     try:
00069         ## loop over image with specified window W
00070         for y in range(window, ylength-(window+1)):
00071             for x in range(window, xlength-(window+1)):
00072             ## populate window, sort, find median
00073                 filter_window = image_array[y-window:y+window+1,x-window:x+window+1]
00074                 target_vector = reshape(filter_window, ((vlength),))
00075                 ## internal sort
00076                 median = demo(target_vector, vlength)
00077                 ##median = medians_1D.quick_select(target_vector, vlength)
00078                 ## check for threshold
00079                 if not threshold > 0:
00080                     image_array[y,x] = median
00081                     pixel_count += 1
00082                 else:
00083                     scale = zeros(vlength)
00084                     for n in range(vlength):
00085                         scale[n] = abs(target_vector[n] - median)
00086                     scale = sort(scale)
00087                     Sk = 1.4826 * (scale[vlength/2])
00088                     if abs(image_array[y,x] - median) > (threshold * Sk):
00089                         image_array[y,x] = median
00090                         pixel_count += 1
00091 
00092     except (TypeError), err:
00093         print "Error in processing function:", err
00094         sys.exit(2)
00095         ## ,NameError,ArithmeticError,LookupError
00096 
00097     print pixel_count, "pixel(s) filtered out of", xlength*ylength
00098     ## convert array back to sequence and return
00099     return reshape(image_array, (xlength*ylength,)).tolist()
00100 
def demo(target_array, array_length):


Generated on Fri Dec 8 18:11:27 2006 for Median Filtering Routines by  doxygen 1.5.1