started adding pymorph library

git-svn-id: http://sextante.googlecode.com/svn/trunk/soft/bindings/qgis-plugin@183 881b9c09-3ef8-f3c2-ec3d-21d735c97f4d
This commit is contained in:
volayaf@gmail.com 2012-05-17 04:02:54 +00:00
parent 38b3212bd2
commit 40f1ea5349
779 changed files with 42140 additions and 4 deletions

View File

@ -23,6 +23,7 @@ from sextante.lastools.LasToolsAlgorithmProvider import LasToolsAlgorithmProvide
from sextante.core.SextanteUtils import SextanteUtils
from sextante.algs.SextanteAlgorithmProvider import SextanteAlgorithmProvider
from sextante.fusion.FusionAlgorithmProvider import FusionAlgorithmProvider
from sextante.pymorph.PymorphAlgorithmProvider import PymorphAlgorithmProvider
class Sextante:
@ -86,6 +87,7 @@ class Sextante:
Sextante.addProvider(FToolsAlgorithmProvider())
Sextante.addProvider(ModelerOnlyAlgorithmProvider())
Sextante.addProvider(GdalAlgorithmProvider())
Sextante.addProvider(PymorphAlgorithmProvider())
Sextante.addProvider(LasToolsAlgorithmProvider())
if SextanteUtils.isWindows():
Sextante.addProvider(FusionAlgorithmProvider())

View File

@ -2,9 +2,9 @@ import os
from sextante.parameters.ParameterFile import ParameterFile
from sextante.fusion.FusionUtils import FusionUtils
from sextante.parameters.ParameterNumber import ParameterNumber
from sextante.outputs.OutputRaster import OutputRaster
from sextante.parameters.ParameterSelection import ParameterSelection
from sextante.fusion.FusionAlgorithm import FusionAlgorithm
from sextante.outputs.OutputFile import OutputFile
class GridSurfaceCreate(FusionAlgorithm):
@ -22,7 +22,7 @@ class GridSurfaceCreate(FusionAlgorithm):
self.addParameter(ParameterNumber(self.CELLSIZE, "Cellsize", 0, None, 10.0))
self.addParameter(ParameterSelection(self.XYUNITS, "XY Units", self.UNITS))
self.addParameter(ParameterSelection(self.ZUNITS, "Z Units", self.UNITS))
self.addOutput(OutputRaster(self.OUTPUT, "PLANS DTM surface"))
self.addOutput(OutputFile(self.OUTPUT, "PLANS DTM surface"))
self.addAdvancedModifiers()
def processAlgorithm(self, progress):

View File

@ -57,10 +57,11 @@ class GdalUtils():
@staticmethod
def getSupportedRasterExtensions():
allexts = []
allexts = ["tif"]
for exts in GdalUtils.getSupportedRasters().values():
for ext in exts:
allexts.append(ext)
if ext not in allexts:
allexts.append(ext)
return allexts
@staticmethod

View File

@ -53,6 +53,7 @@ class ModelerGraphicItem(QtGui.QGraphicsItem):
if not self.model.activateAlgorithm(self.elementIndex, True):
QtGui.QMessageBox.warning(None, "Could not activate Algorithm",
"The selected algorithm depends on other currently non-active algorithms.\nActivate them them before trying to activate it.")
def removeElement(self):
if isinstance(self.element, Parameter):
if not self.model.removeParameter(self.elementIndex):

View File

@ -0,0 +1,15 @@
import os
class AlgNames():
names = {}
@staticmethod
def getName(shortname):
if not AlgNames.names:
f = open(os.path.dirname(__file__) + "/algnames.txt")
lines = f.readlines()
for line in lines:
tokens = line.split(":")
AlgNames.names[tokens[0].strip()] = tokens[1].strip()
f.close()
return AlgNames.names[shortname]

View File

@ -0,0 +1,47 @@
from sextante.script.ScriptAlgorithm import ScriptAlgorithm
from sextante.parameters.ParameterRaster import ParameterRaster
from sextante.outputs.OutputRaster import OutputRaster
from sextante.core.GeoAlgorithm import GeoAlgorithm
from sextante.pymorph.AlgNames import AlgNames
import os
class PymorphAlgorithm(ScriptAlgorithm):
LOAD_LAYER_SCRIPT = "from sextante.gdal.GdalUtils import GdalUtils\n" \
+"from sextante.pymorph.mmorph import datatype\n" \
+"gdal_datatypes={'binary':'Byte','uint8':'Byte','uint16':'UInt16','int32':'Int32'}\n" \
+ "try:\n" \
+ "\tfrom osgeo import gdal\n" \
+ "except ImportError:\n" \
+ "\timport gdal\n" \
+ "gdal.AllRegister()\n" \
+ "img = gdal.Open(input_filename)\n"\
+ "input_array = img.ReadAsArray()\n"
SAVE_LAYER_SCRIPT = "\ndrv = gdal.GetDriverByName(GdalUtils.getFormatShortNameFromFilename(output_filename))\n" \
+ "out = drv.Create(output_filename, img.RasterXSize, img.RasterYSize, 1, gdal.GetDataTypeByName(gdal_datatypes[datatype(output_array)]))\n"\
+ "out.SetGeoTransform( img.GetGeoTransform())\n"\
+ "out.SetProjection( img.GetProjectionRef())\n"\
+ "out.GetRasterBand(1).WriteArray(output_array)"
def getCopy(self):
newone = PymorphAlgorithm(self.descriptionFile)
newone.provider = self.provider
return newone
def getIcon(self):
return GeoAlgorithm.getIcon(self)
def defineCharacteristicsFromFile(self):
ScriptAlgorithm.defineCharacteristicsFromFile(self)
self.parameters.insert(0, ParameterRaster("input_filename", "Input image", False))
self.outputs.append(OutputRaster("output_filename", "Output image"))
self.script = self.LOAD_LAYER_SCRIPT + self.script + self.SAVE_LAYER_SCRIPT
self.name = AlgNames.getName(self.name)
def helpFile(self):
command = os.path.basename(self.descriptionFile)
command = command[:command.rfind(".")].replace("_", "")
filename = os.path.dirname(__file__) + "/html/morph/morph/mm" + command + ".html"
return filename

View File

@ -0,0 +1,43 @@
import os
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from sextante.core.AlgorithmProvider import AlgorithmProvider
from sextante.script.WrongScriptException import WrongScriptException
from sextante.core.SextanteLog import SextanteLog
from sextante.gdal.GdalUtils import GdalUtils
from sextante.pymorph.PymorphAlgorithm import PymorphAlgorithm
class PymorphAlgorithmProvider(AlgorithmProvider):
def __init__(self):
AlgorithmProvider.__init__(self)
#self.readAlgNames()
self.createAlgsList()
def scriptsFolder(self):
return os.path.dirname(__file__) + "/scripts"
def getDescription(self):
return "Pymorph (Morphological image processing tools)"
def getName(self):
return "pymorph"
def _loadAlgorithms(self):
self.algs = self.preloadedAlgs
def createAlgsList(self):
self.preloadedAlgs = []
folder = self.scriptsFolder()
for descriptionFile in os.listdir(folder):
if descriptionFile.endswith("py"):
try:
fullpath = os.path.join(self.scriptsFolder(), descriptionFile)
alg = PymorphAlgorithm(fullpath)
alg.group = "Algorithms"
self.preloadedAlgs.append(alg)
except WrongScriptException,e:
SextanteLog.addToLog(SextanteLog.LOG_ERROR,e.msg)
def getSupportedOutputRasterLayerExtensions(self):
return GdalUtils.getSupportedRasterExtensions()

View File

@ -0,0 +1,8 @@
import mmorph
import text
from mmorph import *
from text import *
from pymorph_version import __version__
__doc__ = mmorph.__doc__
__all__ = mmorph.__all__ + ['text']

View File

@ -0,0 +1,66 @@
add4dilate : Addition for dilation
addm : Addition of two images, with saturation.
areaclose : Area closing
areaopen : Area opening
asf : Alternating Sequential Filtering
asfrec : Reconstructive Alternating Sequential Filtering
binary : Convert a gray-scale image into a binary image
cbisector : N-Conditional bisector.
cdilate : Dilate an image conditionally.
center : Center filter.
cerode : Erode an image conditionally.
closeholes : Close holes of binary and gray-scale images.
close : Morphological closing.
closerec : Closing by reconstruction.
closerecth : Close-by-Reconstruction Top-Hat.
closeth : Closing Top Hat.
cthick : Image transformation by conditional thickening.
cthin : Image transformation by conditional thinning.
cwatershed : Detection of watershed from markers.
datatype : Return the image datatype string
dilate : Dilate an image by a structuring element.
dist : Distance transform.
endpoints : Interval to detect end-points.
erode : Erode an image by a structuring element.
flood : Flooding filter- h,v,a-basin and dynamics (depth, area, volume)
gdist : Geodesic Distance Transform.
gradm : Morphological gradient.
hmax : Remove peaks with contrast less than h.
hmin : Remove basins with contrast less than h.
homothick : Interval for homotopic thickening.
homothin : Interval for homotopic thinning.
infcanon : Intersection of inf-generating operators.
infgen : Inf-generating.
infrec : Inf-reconstruction.
inpos : Minima imposition.
interot : Rotate an interval
intersec : Intersection of images.
isolines : Apply an iso-line color table to a gray-scale image.
label : Label a binary image.
labelflat : Label the flat zones of gray-scale images.
lastero : Last erosion.
neg : Negate an image.
open : Morphological opening.
openrec : Opening by reconstruction.
openrecth : Open-by-Reconstruction Top-Hat.
openth : Opening Top Hat.
opentransf : Open transform.
patspec : Pattern spectrum (also known as granulometric size density).
randomcolor : Apply a random color table to a gray-scale image.
regmax : Regional Maximum.
regmin : Regional Minimum (with generalized dynamics).
skelm : Morphological skeleton (Medial Axis Transform).
skelmrec : Morphological skeleton reconstruction (Inverse Medial Axis Transform).
skiz : Skeleton of Influence Zone - also know as Generalized Voronoi Diagram
subm : Subtraction of two images, with saturation.
supcanon : Union of sup-generating or hit-miss operators.
supgen : Sup-generating (hit-miss).
suprec : Sup-reconstruction.
symdiff : Symmetric difference between two images
text : Create a binary image of a text.
thick : Image transformation by thickening.
thin : Image transformation by thinning.
threshad : Threshold (adaptive)
toggle : Image contrast enhancement or classification by the toggle operator.
union : Union of images.
watershed : Watershed detection.

View File

@ -0,0 +1,678 @@
import warnings
warnings.warn('pymorph.compat should be replaced with pymorph', DeprecationWarning)
from notimplemented import *
from mmorph import *
from text import *
# old abbreviations:
clohole=close_holes
ero=erode
cero=cerode
dil=dilate
cdil=cdilate
sedil=sedilate
add4dil=add4dilate
uint8=to_uint8
uint16=to_uint16
int32=to_int32
glblshow=randomcolor
randomcolour=randomcolor
# mmnames:
def _not_implemented(msg):
def f(*args, **kwargs):
raise NotImplementedError, msg
f.__doc__ = '''\
This function is not implemented anymore.
%s''' % msg
return f
mmadd4dil=add4dil
mmaddm=addm
mmareaclose=areaclose
mmareaopen=areaopen
mmasf=asf
mmasfrec=asfrec
mmbinary=binary
mmblob=blob
mmbshow=bshow
mmcbisector=cbisector
mmcdil=cdil
mmcenter=center
mmcero=cero
mmclohole=clohole
mmclose=close
mmcloserec=closerec
mmcloserecth=closerecth
mmcloseth=closeth
mmconcat=concat
mmcthick=cthick
mmcthin=cthin
mmcwatershed=cwatershed
mmdatatype=datatype
mmdil=dil
mmdist=dist
mmdrawv=drawv
mmdtshow=_not_implemented('dtshow: use matplotlib')
mmedgeoff=edgeoff
mmero=ero
mmflood=flood
mmframe=frame
mmgdist=gdist
mmgdtshow=_not_implemented('gdtshow: use matplotlib')
mmgradm=gradm
mmgrain=grain
mmgray=gray
mmhistogram=histogram
mmhmax=hmax
mmhmin=hmin
mmhomothick=homothick
mmhomothin=homothin
mmimg2se=img2se
mminfcanon=infcanon
mminfgen=infgen
mminfrec=infrec
mminpos=inpos
mminterot=interot
mmintersec=intersec
mmintershow=intershow
mmisbinary=isbinary
mmisequal=isequal
mmlabel=label
mmlabelflat=labelflat
mmlastero=lastero
mmlblshow=_not_implemented('lblshow: use matplotlib')
mmlimits=limits
mmmat2set=mat2set
mmmaxleveltype=maxleveltype
mmneg=neg
mmopen=open
mmopenrec=openrec
mmopenrecth=openrecth
mmopenth=openth
mmopentransf=opentransf
mmpad4n=pad4n
mmpatspec=patspec
mmreadgray=_not_implemented('readgray: use PIL or readmagick')
mmregmax=regmax
mmregmin=regmin
mmse2hmt=se2hmt
mmse2interval=se2interval
mmsebox=sebox
mmsecross=secross
mmsedil=sedil
mmsedisk=sedisk
mmseline=seline
mmsereflect=sereflect
mmserot=serot
mmseshow=seshow
mmsesum=sesum
mmset2mat=set2mat
mmsetrans=setrans
mmseunion=seunion
mmskelm=skelm
mmskelmrec=skelmrec
mmskiz=skiz
mmsubm=subm
mmsupcanon=supcanon
mmsupgen=supgen
mmsuprec=suprec
mmswatershed=swatershed
mmsymdif=symdiff
mmtext=text
mmthick=thick
mmthin=thin
mmthreshad=threshad
mmtoggle=toggle
mmunion=union
mmvmax=vmax
mmwatershed=watershed
gshow=overlay
gdtshow=isolines
# Functions which were removed:
def mminstall(*args):
pass
def mmversion(*args):
pass
def mmregister(*args):
pass
def mmcmp(f1, oper, f2, oper1=None, f3=None):
"""
- Alternative:
Consider using array operations directly, i.e., instead of
mmcmp(f1, '>', f2)
simply use
f1 > f2
- Purpose
Compare two images pixelwisely.
- Synopsis
y = mmcmp(f1, oper, f2, oper1=None, f3=None)
- Input
f1: Gray-scale (uint8 or uint16) or binary image.
oper: String Default: "". relationship from: '==', '~=',
'<','<=', '>', '>='.
f2: Gray-scale (uint8 or uint16) or binary image.
oper1: String Default: None. relationship from: '==', '~=',
'<','<=', '>', '>='.
f3: Gray-scale (uint8 or uint16) or binary image. Default:
None.
- Output
y: Binary image.
- Description
Apply the relation oper to each pixel of images f1 and f2 , the
result is a binary image with the same size. Optionally, it is
possible to make the comparison among three image. It is
possible to use a constant value in place of any image, in this
case the constant is treated as an image of the same size as the
others with all pixels with the value of the constant.
- Examples
#
# example 1
#
print cmp(to_uint8([1, 2, 3]),'<', to_uint8(2))
print cmp(to_uint8([1, 2, 3]),'<', to_uint8([0, 2, 4]))
print cmp(to_uint8([1, 2, 3]),'==', to_uint8([1, 1, 3]))
#
# example 2
#
f=readgray('keyb.tif')
fbin=cmp(to_uint8(10), '<', f, '<', to_uint8(50))
show(f)
show(fbin)
"""
if oper == '==': y = (f1==f2)
elif oper == '~=': y = (f1!=f2)
elif oper == '<=': y = (f1<=f2)
elif oper == '>=': y = (f1>=f2)
elif oper == '>': y = (f1> f2)
elif oper == '<': y = (f1< f2)
else:
assert 0, 'oper must be one of: ==, ~=, >, >=, <, <=, it was:'+oper
if oper1 != None:
if oper1 == '==': y = intersec(y, f2==f3)
elif oper1 == '~=': y = intersec(y, f2!=f3)
elif oper1 == '<=': y = intersec(y, f2<=f3)
elif oper1 == '>=': y = intersec(y, f2>=f3)
elif oper1 == '>': y = intersec(y, f2> f3)
elif oper1 == '<': y = intersec(y, f2< f3)
else:
assert 0, 'oper1 must be one of: ==, ~=, >, >=, <, <=, it was:'+oper1
y = binary(y)
return y
def mmvdome(f, v=1, Bc=None):
"""
- Purpose
Obsolete, use vmax.
- Synopsis
y = mmvdome(f, v=1, Bc=None)
- Input
f: Gray-scale (uint8 or uint16) image.
v: Default: 1. Volume parameter.
Bc: Structuring Element Default: None (3x3 elementary cross).
Structuring element (connectivity).
- Output
y: Gray-scale (uint8 or uint16) or binary image.
- Description
The correct name for this operator mmvdome is vmax.
"""
if Bc is None: Bc = secross()
y = hmax(f,v,Bc);
return y
def mmis(f1, oper, f2=None, oper1=None, f3=None):
"""
- Alternative
Consider using array operations or isbinary()
- Purpose
Verify if a relationship among images is true or false.
- Synopsis
y = mmis(f1, oper, f2=None, oper1=None, f3=None)
- Input
f1: Gray-scale (uint8 or uint16) or binary image.
oper: String relationship from: '==', '~=', '<','<=', '>',
'>=', 'binary', 'gray'.
f2: Gray-scale (uint8 or uint16) or binary image. Default:
None.
oper1: String Default: None. relationship from: '==', '~=',
'<','<=', '>', '>='.
f3: Gray-scale (uint8 or uint16) or binary image. Default:
None.
- Output
y: Bool value: 0 or 1
- Description
Verify if the property or relatioship between images is true or
false. The result is true if the relationship is true for all
the pixels in the image, and false otherwise. (Obs: This
function replaces is equal, is lesseq, is binary ).
- Examples
#
fbin=binary([0, 1])
f1=to_uint8([1, 2, 3])
f2=to_uint8([2, 2, 3])
f3=to_uint8([2, 3, 4])
mmis(fbin,'binary')
mmis(f1,'gray')
mmis(f1,'==',f2)
mmis(f1,'<',f3)
mmis(f1,'<=',f2)
mmis(f1,'<=',f2,'<=',f3)
"""
from string import upper
if f2 == None:
oper=upper(oper);
if oper == 'BINARY': return isbinary(f1)
elif oper == 'GRAY' : return not isbinary(f1)
else:
assert 0,'oper should be BINARY or GRAY, was'+oper
elif oper == '==': y = isequal(f1, f2)
elif oper == '~=': y = not isequal(f1,f2)
elif oper == '<=': y = mmislesseq(f1,f2)
elif oper == '>=': y = mmislesseq(f2,f1)
elif oper == '>': y = isequal(neg(threshad(f2,f1)),binary(1))
elif oper == '<': y = isequal(neg(threshad(f1,f2)),binary(1))
else:
assert 0,'oper must be one of: ==, ~=, >, >=, <, <=, it was:'+oper
if oper1 != None:
if oper1 == '==': y = y and isequal(f2,f3)
elif oper1 == '~=': y = y and (not isequal(f2,f3))
elif oper1 == '<=': y = y and mmislesseq(f2,f3)
elif oper1 == '>=': y = y and mmislesseq(f3,f2)
elif oper1 == '>': y = y and isequal(neg(threshad(f3,f2)),binary(1))
elif oper1 == '<': y = y and isequal(neg(threshad(f2,f3)),binary(1))
else:
assert 0,'oper1 must be one of: ==, ~=, >, >=, <, <=, it was:'+oper1
return y
def mmislesseq(f1, f2, MSG=None):
"""
- Alternative
Consider using f1 <= f2
- Purpose
Verify if one image is less or equal another (is beneath)
- Synopsis
bool = mmislesseq(f1, f2)
- Input
f1: Gray-scale (uint8 or uint16) or binary image.
f2: Gray-scale (uint8 or uint16) or binary image.
- Output
bool: Boolean
- Description
mmislesseq compares the images f1 and f2 and returns true (1),
if f1(x) <= f2(x) , for every pixel x, and false (0), otherwise.
- Examples
#
f1 = to_uint8([0, 1, 2, 3])
f2 = to_uint8([9, 5, 3, 3])
print mmislesseq(f1,f2)
print mmislesseq(f2,f1)
print mmislesseq(f1,f1)
"""
from numpy import ravel
bool = min(ravel(f1<=f2))
return bool
def mmstats(f, measurement):
"""
- Purpose
Find global image statistics.
- Synopsis
y = mmstats(f, measurement)
- Input
f:
measurement: String Default: "". Choose the measure to compute:
'max', 'min', 'median', 'mean', 'sum', 'std',
'std1'.
- Output
y:
- Description
Compute global image statistics: 'max' - maximum gray-scale
value in image; 'min' - minimum gray-scale value in image; 'sum'
- sum of all pixel values; 'median' - median value of all pixels
in image; 'mean' - mean value of all pixels in image; 'std' -
standard deviation of all pixels (normalized by N-1); 'std1' -
idem, normalized by N.
"""
from string import upper
from numpy import ravel
from numpy.oldnumeric.mlab import mean, median, std
measurement = upper(measurement)
if measurement == 'MAX': return f.max()
elif measurement == 'MIN': return f.min()
elif measurement == 'MEAN': return f.mean()
elif measurement == 'MEDIAN': return f.median()
elif measurement == 'STD': return f.std()
else:
assert 0,'pymorph.compat.mmstats: Not a valid measurement'
def mmsurf(f,options = None):
return f
_figs = [None]
def plot(plotitems=[], options=[], outfig=-1, filename=None):
"""
- Purpose
Plot a function.
- Synopsis
fig = plot(plotitems=[], options=[], outfig=-1, filename=None)
- Input
plotitems: Default: []. List of plotitems.
options: Default: []. List of options.
outfig: Default: -1. Integer. Figure number. 0 creates a new
figure.
filename: Default: None. String. Name of the PNG output file.
- Output
fig: Figure number.
- Examples
#
import numpy
#
x = numpy.arange(0, 2*numpy.pi, 0.1)
plot([[x]])
y1 = numpy.sin(x)
y2 = numpy.cos(x)
opts = [['title', 'Example Plot'],\
['grid'],\
['style', 'linespoints'],\
['xlabel', '"X values"'],\
['ylabel', '"Y Values"']]
y1_plt = [x, y1, None, 'sin(X)']
y2_plt = [x, y2, 'lines', 'cos(X)']
#
# plotting two graphs using one step
fig1 = plot([y1_plt, y2_plt], opts, 0)
#
# plotting the same graphs using two steps
fig2 = plot([y1_plt], opts, 0)
fig2 = plot([y2_plt], opts, fig2)
#
# first function has been lost, lets recover it
opts.append(['replot'])
fig2 = plot([y1_plt], opts, fig2)
"""
import Gnuplot
import numpy
newfig = 0
if (plotitems == 'reset'):
_figs[0] = None
_figs[1:] = []
return 0
if len(plotitems) == 0:
# no plotitems specified: replot current figure
if _figs[0]:
outfig = _figs[0]
g = _figs[outfig]
g.replot()
return outfig
else:
#assert 0, "plot error: There is no current figure\n"
print "plot error: There is no current figure\n"
return 0
# figure to be plotted
if ((outfig < 0) and _figs[0]):
# current figure
outfig = _figs[0]
elif ( (outfig == 0) or ( (outfig == -1) and not _figs[0] ) ):
# new figure
newfig = 1
outfig = len(_figs)
elif outfig >= len(_figs):
#assert 0, 'plot error: Figure ' + str(outfig) + 'does not exist\n'
print 'plot error: Figure ' + str(outfig) + 'does not exist\n'
return 0
#current figure
_figs[0] = outfig
# Gnuplot pointer
if newfig:
if len(_figs) > 20:
print '''plot error: could not create figure. Too many PlotItems in memory (20). Use
plot('reset') to clear table'''
return 0
g = Gnuplot.Gnuplot()
_figs.append(g)
else:
g = _figs[outfig]
# options
try:
options.remove(['replot'])
except:
g.reset()
try:
#default style
g('set data style lines')
for option in options:
if option[0] == 'grid':
g('set grid')
elif option[0] == 'title':
g('set title "' + option[1] + '"')
elif option[0] == 'xlabel':
g('set xlabel ' + option[1])
elif option[0] == 'ylabel':
g('set ylabel ' + option[1])
elif option[0] == 'style':
g('set data style ' + option[1])
else:
print "plot warning: Unknown option: " + option[0]
except:
print "plot warning: Bad usage in options! Using default values. Please, use help.\n"
# Plot items: item[0]=x, item[1]=y, item[2]=style
for item in plotitems:
try:
title = None
style = None
x = numpy.ravel(item[0])
if len(item) > 1:
# y axis specified
y = numpy.ravel(item[1])
if len(item) > 2:
# style specified
style = item[2]
if len(item) > 3:
title = item[3]
else:
# no y axis specified
y = x
x = numpy.arange(len(y))
g.replot(Gnuplot.Data(x, y, title=title, with_=style))
except:
g.reset()
if newfig:
_figs.pop()
#assert 0, "plot error: Bad usage in plotitems! Impossible to plot graph. Please, use help.\n"
print "plot error: Bad usage in plotitems! Impossible to plot graph. Please, use help.\n"
return 0
# PNG file
if filename:
g.hardcopy(filename, terminal='png', color=1)
fig = outfig
return fig
mmplot=plot
def mmwatershed(f,Bc=None,linereg='LINES'):
return watershed(f,Bc,(linereg == 'LINES'))
def mmcwatershed(f,Bc=None,linereg='LINES'):
return cwatershed(f,Bc,(linereg == 'LINES'))
def mmskiz(f,Bc=None,LINEREG='LINES',METRIC=None):
return skiz(f,Bc,(LINEREG=='LINES'),METRIC)
def mmdist(f,Bc=None,METRIC=None):
return dist(f,Bc,metric=METRIC)
def mmendpoints(OPTION='LOOP'):
return endpoints(option=OPTION)
def mmgshow(X, X1=None, X2=None, X3=None, X4=None, X5=None, X6=None):
"""
- Purpose
Apply binary overlays as color layers on a binary or gray-scale
image
- Synopsis
Y = gshow(X, X1=None, X2=None, X3=None, X4=None, X5=None,
X6=None)
- Input
X: Gray-scale (uint8 or uint16) or binary image.
X1: Binary image. Default: None. Red overlay.
X2: Binary image. Default: None. Green overlay.
X3: Binary image. Default: None. Blue overlay.
X4: Binary image. Default: None. Magenta overlay.
X5: Binary image. Default: None. Yellow overlay.
X6: Binary image. Default: None. Cyan overlay.
- Output
Y: Gray-scale (uint8 or uint16) or binary image.
"""
if isbinary(X): X = gray(X,'uint8')
r = X
g = X
b = X
if X1 is not None: # red 1 0 0
assert isbinary(X1),'X1 must be binary overlay'
x1 = gray(X1,'uint8')
r = union(r,x1)
g = intersec(g,neg(x1))
b = intersec(b,neg(x1))
if X2 is not None: # green 0 1 0
assert isbinary(X2),'X2 must be binary overlay'
x2 = gray(X2,'uint8')
r = intersec(r,neg(x2))
g = union(g,x2)
b = intersec(b,neg(x2))
if X3 is not None: # blue 0 0 1
assert isbinary(X3),'X3 must be binary overlay'
x3 = gray(X3,'uint8')
r = intersec(r,neg(x3))
g = intersec(g,neg(x3))
b = union(b,x3)
if X4 is not None: # magenta 1 0 1
assert isbinary(X4),'X4 must be binary overlay'
x4 = gray(X4,'uint8')
r = union(r,x4)
g = intersec(g,neg(x4))
b = union(b,x4)
if X5 is not None: # yellow 1 1 0
assert isbinary(X5),'X5 must be binary overlay'
x5 = gray(X5,'uint8')
r = union(r,x5)
g = union(g,x5)
b = intersec(b,neg(x5))
if X6 is not None: # cyan 0 1 1
assert isbinary(X6),'X6 must be binary overlay'
x6 = gray(X6,'uint8')
r = intersec(r,neg(x6))
g = union(g,x6)
b = union(b,x6)
return concat('d',r,g,b)
def mmglblshow(X, border=0.0):
"""
- Purpose
Apply a random color table to a gray-scale image.
- Synopsis
Y = glblshow(X, border=0.0)
- Input
X: Gray-scale (uint8 or uint16) image. Labeled image.
border: Boolean Default: 0.0. Labeled image.
- Output
Y: Gray-scale (uint8 or uint16) or binary image.
"""
from numpy import take, resize, shape
from numpy.random import rand
mmin = X.min()
mmax = X.max()
ncolors = mmax - mmin + 1
R = to_int32(rand(ncolors)*255)
G = to_int32(rand(ncolors)*255)
B = to_int32(rand(ncolors)*255)
if mmin == 0:
R[0],G[0],B[0] = 0,0,0
r=resize(take(R, X.ravel() - mmin),X.shape)
g=resize(take(G, X.ravel() - mmin),X.shape)
b=resize(take(B, X.ravel() - mmin),X.shape)
Y=concat('d',r,g,b)
return Y
def readgray(filename):
"""
- Purpose
Read an image from a coercial file format and stores it as a
gray-scale image.
- Synopsis
y = readgray(filename)
- Input
filename: String Name of file to read.
- Output
y: Gray-scale (uint8 or uint16) or binary image.
- Description
readgray reads the image in filename and stores it in y , an
uint8 gray-scale image (without colormap). If the input file is
a color RGB image, it is converted to gray-scale using the
equation: y = 0.2989 R + 0.587 G + 0.114 B. This functions uses
de PIL module.
- Examples
#
a=readgray('cookies.tif')
show(a)
"""
import pylab
import numpy
y = pylab.imread(filename)
if (len(y.shape) == 3) and (y.shape[0] == 3):
if numpy.alltrue(numpy.alltrue(y[0,:,:] == y[1,:,:] and
y[0,:,:] == y[2,:,:])):
y = y[0,:,:]
else:
print 'Warning: converting true-color RGB image to gray'
y = ubyte(0.2989 * y[0,:,:] +
0.5870 * y[1,:,:] +
0.1140 * y[2,:,:])
elif (len(y.shape) == 2):
pass
else:
raise ValueError, 'Error, it is not 2D image'
return y
def freedom(L=5):
"""
DOES NOT DO ANYTHING
"""
return -1
mmfreedom=freedom

View File

@ -0,0 +1,107 @@
<html>
<head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type">
<title>Install</title>
<link href="morph/tbxdok.css" rel="stylesheet">
</head>
<body>
<table class="topNav">
<tr>
<td class="index">
[<a href="index.html">Home</a>]
[<a href="Readme.html">General Description</a>]
[<a href="Install.html">Installation Instructions</a>]
[<a href="License.html">License Terms</a>]
[<a href="morph/index.html">Documentation</a>]
[<a href="http://sourceforge.net/project/showfiles.php?group_id=72435">Downloads</a>]
[<a href="http://sourceforge.net/projects/pymorph/">Project Page</a>]
[<a href="http://sourceforge.net/project/memberlist.php?group_id=72435">Contact Info</a>]
</td>
<td class="title">pymorph Morphology Toolbox V0.8 01Aug03</td>
</tr>
</table>
<h1>Install
<br>
</h1>
<div class="H1">
<p>
<div class="docbook">
<H3>Installation instructions for the pymorph Morphology Toolbox V0.8.</H3>
<div class="H3">
<div class="">
<H4>Requirements</H4>
<div class="H4">
<p> Before installing the pymorph Morphology Toolbox for Python, make sure the following packages are correctly
installed:
</p>
<ol>
<li>Python 2.2 or higher.</li>
<li>Numeric 22.0 or higher. Available at Numerical Python Home Page, http://numpy.sourceforge.net/</li>
<li>PIL, the Python Imaging Library, available at http://www.pythonware.com/products/pil/</li>
</ol>
<p> Future releases are supposed to include Numeric and PIL in the pymorph package.
</p>
</div>
</div>
<div class="">
<H4>Installation in Any platform</H4>
<div class="H4">
<ol>
<li>Unzip the file morph08pybase.zip. A new directory called morph08pybase will be created.</li>
<li>Enter the morph08pybase directory.</li>
<li>Type "python setup.py install". You may need admin permissions to perform this action.</li>
</ol>
</div>
</div>
<div class="">
<H4>Uninstallation</H4>
<div class="H4">pymorph Morphology Toolbox for PYTHON package files are installed at the
<code>$PYTHON_HOME/site-packages/adtools/morph08pybase</code>. Where
<code>$PYTHON_HOME</code> is the Python installation directory. You can uninstall the pymorph Morphology Toolbox for PYTHON by deleting everything under this directory.
</div>
</div>
</div>
</div>
</p>
</div>
<center>
<table class="botNav">
<tr>
<td class="index">
[<a href="index.html">Home</a>]
[<a href="Readme.html">General Description</a>]
[<a href="Install.html">Installation Instructions</a>]
[<a href="License.html">License Terms</a>]
[<a href="morph/index.html">Documentation</a>]
[<a href="http://sourceforge.net/project/showfiles.php?group_id=72435">Downloads</a>]
[<a href="http://sourceforge.net/projects/pymorph/">Project Page</a>]
[<a href="http://sourceforge.net/project/memberlist.php?group_id=72435">Contact Info</a>]
</td>
<td rowspan="2" class="sponsor"><a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.php?group_id=72435&amp;type=2" alt="http://sourceforge.net" border="0"></a></td>
<td rowspan="2" class="sponsor"><a href="http://www.python.org"><img src="http://www.python.org/pics/PythonPoweredSmall.gif" alt="http://www.python.org" border="0"></a></td>
</tr>
<tr>
<td class="copyright">Copyright (c) 2003, Roberto A. Lotufo, UNICAMP-University of Campinas; Rubens C. Machado, CenPRA-Renato Archer Research Center.</td>
</tr>
</table>
</center>
</body>
</html>

View File

@ -0,0 +1,77 @@
<html>
<head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type">
<title>License</title>
<link href="morph/tbxdok.css" rel="stylesheet">
</head>
<body>
<table class="topNav">
<tr>
<td class="index">
[<a href="index.html">Home</a>]
[<a href="Readme.html">General Description</a>]
[<a href="Install.html">Installation Instructions</a>]
[<a href="License.html">License Terms</a>]
[<a href="morph/index.html">Documentation</a>]
[<a href="http://sourceforge.net/project/showfiles.php?group_id=72435">Downloads</a>]
[<a href="http://sourceforge.net/projects/pymorph/">Project Page</a>]
[<a href="http://sourceforge.net/project/memberlist.php?group_id=72435">Contact Info</a>]
</td>
<td class="title">pymorph Morphology Toolbox V0.8 01Aug03</td>
</tr>
</table>
<h1>License
<br>
</h1>
<div class="H1">
<p>
The pymorph Morphology Toolbox for Python is ruled by the BSD License Terms.
<div class="bridge">The BSD Licence</div> Copyright (c) 2003, Roberto A. Lotufo, UNICAMP-University of Campinas; Rubens C. Machado, CenPRA-Renato Archer Research Center.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted
provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of UNICAMP, CenPRA nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</p>
</div>
<center>
<table class="botNav">
<tr>
<td class="index">
[<a href="index.html">Home</a>]
[<a href="Readme.html">General Description</a>]
[<a href="Install.html">Installation Instructions</a>]
[<a href="License.html">License Terms</a>]
[<a href="morph/index.html">Documentation</a>]
[<a href="http://sourceforge.net/project/showfiles.php?group_id=72435">Downloads</a>]
[<a href="http://sourceforge.net/projects/pymorph/">Project Page</a>]
[<a href="http://sourceforge.net/project/memberlist.php?group_id=72435">Contact Info</a>]
</td>
<td rowspan="2" class="sponsor"><a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.php?group_id=72435&amp;type=2" alt="http://sourceforge.net" border="0"></a></td>
<td rowspan="2" class="sponsor"><a href="http://www.python.org"><img src="http://www.python.org/pics/PythonPoweredSmall.gif" alt="http://www.python.org" border="0"></a></td>
</tr>
<tr>
<td class="copyright">Copyright (c) 2003, Roberto A. Lotufo, UNICAMP-University of Campinas; Rubens C. Machado, CenPRA-Renato Archer Research Center.</td>
</tr>
</table>
</center>
</body>
</html>

View File

@ -0,0 +1,98 @@
<html>
<head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type">
<title>Readme</title>
<link href="morph/tbxdok.css" rel="stylesheet">
</head>
<body>
<table class="topNav">
<tr>
<td class="index">
[<a href="index.html">Home</a>]
[<a href="Readme.html">General Description</a>]
[<a href="Install.html">Installation Instructions</a>]
[<a href="License.html">License Terms</a>]
[<a href="morph/index.html">Documentation</a>]
[<a href="http://sourceforge.net/project/showfiles.php?group_id=72435">Downloads</a>]
[<a href="http://sourceforge.net/projects/pymorph/">Project Page</a>]
[<a href="http://sourceforge.net/project/memberlist.php?group_id=72435">Contact Info</a>]
</td>
<td class="title">pymorph Morphology Toolbox V0.8 01Aug03</td>
</tr>
</table>
<h1>Readme
<br>
</h1>
<div class="H1">
<p>
<div class="docbook">
<H3>README</H3>
<div class="H3">
<p>The pymorph Morphology Toolbox for Python is a software for Image Analysis and Signal Processing. It is composed by a family of discrete non linear filters based on lattice operations. These filters, called morphological operators, are quite useful for restoration, segmentation and quantitative analysis of Images and Signals.
</p>
<p>The pymorph Morphology Toolbox contains state-of-the-art morphological operators, implemented by simple algorithms. The available operators go from the classical morphological filters, used for restoration and shape description, to the modern connected filters and watersheds, so powerful for image segmentation.
</p>
<p>The potential of the pymorph Morphology Toolbox is illustrated by several demos, that show the morphological solution of many real-life image processing problems. Some of the application areas covered are machine vision, medical imaging, desktop publishing, document processing, food industry and agriculture.
</p>
<p>The reference manual has a page of documentation for each function of the toolbox. These pages present the respective command syntax, a detailed explanation of the necessary parameters, a short description, an application example and the formal definition.
</p>
<p>The pymorph Morphology Toolbox deals with gray-scale and binary images (or signals) and is data type oriented. Thus, most operators perform both gray-scale and binary image (or signal) processing and the choice of the appropriate (binary or gray-scale) algorithm is automatic.
</p>
<p>The images (or signals) may be represented by the formats: binary, 8-bit gray-scale and 16-bit gray-scale, where each pixel is represented, respectively, by a logical uint8, a uint8 and uint16 data type.
</p>
<p>Morphological operators may be written hierarchically from two elementary operators, called dilation and erosion. pymorph Morphology Toolbox has simple implementations for dilation and erosion and permits the realization of any morphological operator by this constructive approach. </p>
<p>Dilations and erosions are parameterized by particular images (or signals), called structuring elements. These structuring elements may be flat (binary images or signals) or non flat (gray-scale images or signals). The pymorph Morphology Toolbox supports both kinds of structuring elements.
</p>
<p>The pymorph Morphology Toolbox is supported in any python environment.
</p>
<p></p>
<p></p>
</div>
</div>
</p>
</div>
<center>
<table class="botNav">
<tr>
<td class="index">
[<a href="index.html">Home</a>]
[<a href="Readme.html">General Description</a>]
[<a href="Install.html">Installation Instructions</a>]
[<a href="License.html">License Terms</a>]
[<a href="morph/index.html">Documentation</a>]
[<a href="http://sourceforge.net/project/showfiles.php?group_id=72435">Downloads</a>]
[<a href="http://sourceforge.net/projects/pymorph/">Project Page</a>]
[<a href="http://sourceforge.net/project/memberlist.php?group_id=72435">Contact Info</a>]
</td>
<td rowspan="2" class="sponsor"><a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.php?group_id=72435&amp;type=2" alt="http://sourceforge.net" border="0"></a></td>
<td rowspan="2" class="sponsor"><a href="http://www.python.org"><img src="http://www.python.org/pics/PythonPoweredSmall.gif" alt="http://www.python.org" border="0"></a></td>
</tr>
<tr>
<td class="copyright">Copyright (c) 2003, Roberto A. Lotufo, UNICAMP-University of Campinas; Rubens C. Machado, CenPRA-Renato Archer Research Center.</td>
</tr>
</table>
</center>
</body>
</html>

View File

@ -0,0 +1,141 @@
<html>
<head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type">
<title>pymorph Morphology Toolbox V0.8 01Aug03</title>
<link href="morph/tbxdok.css" rel="stylesheet">
</head>
<body>
<table class="topNav">
<tr>
<td class="index">
[<a href="index.html">Home</a>]
[<a href="Readme.html">General Description</a>]
[<a href="Install.html">Installation Instructions</a>]
[<a href="License.html">License Terms</a>]
[<a href="morph/index.html">Documentation</a>]
[<a href="http://sourceforge.net/project/showfiles.php?group_id=72435">Downloads</a>]
[<a href="http://sourceforge.net/projects/pymorph/">Project Page</a>]
[<a href="http://sourceforge.net/project/memberlist.php?group_id=72435">Contact Info</a>]
</td>
<td class="title">pymorph Morphology Toolbox V0.8 01Aug03</td>
</tr>
</table>
<h1>pymorph Morphology Toolbox
<br>
<span class="subtitle">Morphological image processing tools for Python.
</span>
</h1>
<h2 class="index">Description</h2>
<br>
<div class="h2">
<p>The pymorph Morphology Toolbox
for Python
is a powerful collection of latest state-of-the-art gray-scale morphological tools that can be applied to image segmentation, non-linear filtering, pattern recognition and image analysis.
</p>
<p>The pymorph Morphology Toolbox
is an open source software for Morphological
Image Analysis and Signal Processing written in Python. It is a
companion resource for the book:
<a href="http://www.spie.org/web/abstracts/oepress/TT59.html">Hands-on
Morphological Image Processing</a>
, by Edward Dougherty and Roberto
Lotufo, published by SPIE, Aug 2003, ISBN=0-8194-4720-X.
</p>
<p>From its preface:
<blockquote>"The book is hands-on in a very
real sense. Most of the techniques used in the book are available in
the Morphology Toolbox, and a great majority of the images shown in
the text have been processed by the toolbox. These images, along with
a demonstration version of the toolbox are downloadable free from the
web (
<a href="http://sourceforge.net/projects/pymorph">http://sourceforge.net/projects/pymorph</a>
), so that
the reader can actually process the images according to the examples
and demonstrations in the text. There is a brief discussion in the
first chapter as to how the toolbox correlates to the text, but we do
not emphasize this relation throughout the text since we do not want
to digress from the imaging essentials. Detailed use of the toolbox
can be learned from the downloadable version. To assist the user, each
chapter concludes with a list of the toolbox operations used in the
chapter, and the detailed demonstration sections include corresponding
toolbox implementations".
</blockquote>
</p>
<p> As the fuctions are written in pure Python, some functions are
not very efficient and may take very long to process. In this case, it
is possible to use a professional version available at
<a href="http://www.mmorph.com/pymorphpro">http://www.mmorph.com/pymorphpro</a>
. This version is a superset
of the pymorph project.
</p>
<p> The images used in the book
together with the python scripts to build most of the figures that
illustrate the book will be available in mid-August 2003.
</p>
</div>
<h2 class="index">On-line Documentation</h2>
<div class="h2">
<table class="dirlist">
<tbody valign="baseline">
<tr>
<td><a href="Readme.html">General Description</a></td>
</tr>
<tr>
<td><a href="Install.html">Installation Instructions</a></td>
</tr>
<tr>
<td><a href="License.html">License Terms</a></td>
</tr>
<tr>
<td><a href="morph/index.html">Documentation</a></td>
</tr>
<tr>
<td><a href="http://sourceforge.net/project/showfiles.php?group_id=72435">Downloads</a></td>
</tr>
<tr>
<td><a href="http://sourceforge.net/projects/pymorph/">Project Page</a></td>
</tr>
<tr>
<td><a href="http://sourceforge.net/project/memberlist.php?group_id=72435">Contact Info</a></td>
</tr>
</tbody>
</table>
</div>
<center>
<table class="botNav">
<tr>
<td class="index">
[<a href="index.html">Home</a>]
[<a href="Readme.html">General Description</a>]
[<a href="Install.html">Installation Instructions</a>]
[<a href="License.html">License Terms</a>]
[<a href="morph/index.html">Documentation</a>]
[<a href="http://sourceforge.net/project/showfiles.php?group_id=72435">Downloads</a>]
[<a href="http://sourceforge.net/projects/pymorph/">Project Page</a>]
[<a href="http://sourceforge.net/project/memberlist.php?group_id=72435">Contact Info</a>]
</td>
<td rowspan="2" class="sponsor"><a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.php?group_id=72435&amp;type=2" alt="http://sourceforge.net" border="0"></a></td>
<td rowspan="2" class="sponsor"><a href="http://www.python.org"><img src="http://www.python.org/pics/PythonPoweredSmall.gif" alt="http://www.python.org" border="0"></a></td>
</tr>
<tr>
<td class="copyright">Copyright (c) 2003, Roberto A. Lotufo, UNICAMP-University of Campinas; Rubens C. Machado, CenPRA-Renato Archer Research Center.</td>
</tr>
</table>
</center>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 920 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1016 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 904 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 853 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 654 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 893 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 871 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 549 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 536 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 830 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 848 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 794 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 923 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 623 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 562 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 692 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 744 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 903 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 740 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 742 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 944 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 610 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 651 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 652 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1016 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1007 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 665 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 671 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 543 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 418 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 532 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 893 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 879 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 561 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 557 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 815 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 907 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 815 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Some files were not shown because too many files have changed in this diff Show More