Пример #1
0
def iasedil(B1, B2):
    from ia870 import ialimits, iagray, iabinary, iaisbinary, iamat2set, iaadd4dil, iasetrans, iaseunion

    assert (iaisbinary(B1) or (B1.dtype == int32) or (B1.dtype == int64) or (B1.dtype == float64)) and \
           (iaisbinary(B2) or (B2.dtype == int32) or (B2.dtype == int64) or (B2.dtype == float64)), \
           'iasedil: s.e. must be binary, int32, int64 or float64'
    if len(B1.shape) == 1: B1 = B1[newaxis, :]
    if len(B2.shape) == 1: B2 = B2[newaxis, :]
    if B1.dtype == 'bool' and B2.dtype == 'bool':
        Bo = iabinary([0])
    else:
        Bo = array(ialimits(B1)[0]).reshape(1)
        if iaisbinary(B1):
            Bo = array(ialimits(B2)[0]).reshape(1)
            B1 = iagray(B1, B2.dtype, 0)
        if iaisbinary(B2):
            Bo = array(ialimits(B1)[0]).reshape(1)
            B2 = iagray(B2, B1.dtype, 0)
    x, v = iamat2set(B2)
    if len(x):
        for i in range(x.shape[0]):
            s = iaadd4dil(B1, v[i])
            st = iasetrans(s, x[i])
            Bo = iaseunion(Bo, st)
    return Bo
Пример #2
0
def iasedil(B1, B2):
    from ia870 import ialimits, iagray, iabinary, iaisbinary, iamat2set, iaadd4dil, iasetrans, iaseunion

    assert (iaisbinary(B1) or (B1.dtype == int32) or (B1.dtype == int64) or (B1.dtype == float64)) and \
           (iaisbinary(B2) or (B2.dtype == int32) or (B2.dtype == int64) or (B2.dtype == float64)), \
           'iasedil: s.e. must be binary, int32, int64 or float64'
    if len(B1.shape) == 1: B1 = B1[newaxis,:]
    if len(B2.shape) == 1: B2 = B2[newaxis,:]
    if B1.dtype=='bool' and B2.dtype == 'bool':
       Bo = iabinary([0])
    else:
       Bo = array(ialimits(B1)[0]).reshape(1)
       if iaisbinary(B1):
          Bo = array(ialimits(B2)[0]).reshape(1)
          B1 = iagray(B1,B2.dtype,0)
       if iaisbinary(B2):
          Bo = array(ialimits(B1)[0]).reshape(1)
          B2 = iagray(B2,B1.dtype,0)
    x,v = iamat2set(B2)
    if len(x):
        for i in range(x.shape[0]):
            s = iaadd4dil(B1,v[i])
            st= iasetrans(s,x[i])
            Bo = iaseunion(Bo,st)
    return Bo
Пример #3
0
def iaseshow(B, option="NORMAL"):
    from ia870 import iaisbinary, iaintersec, iagray, iabinary
    from ia870 import iasedil, iaero, iabshow

    option = upper(option)
    if option == 'NON-FLAT':
        y = array([0], int32)
        if iaisbinary(B):
            B = iaintersec(iagray(B, 'int32'), 0)
    elif option == 'NORMAL':
        if iaisbinary(B): y = iabinary([1])
        else:
            y = array([0], int32)
    elif option == 'EXPAND':
        assert iaisbinary(B), 'This option is only available with flat SE'
        y = iasedil(iabinary([1]), B)
        b1 = iabinary(y >= 0)
        b0 = b1 < 0
        b0[shape(b0)[0] / 2, shape(b0)[1] / 2] = 1
        y = iabshow(b1, y, b0)
        return y
    else:
        print('iaseshow: not a valid flag: NORMAL, EXPAND or NON-FLAT')

    y = iasedil(y, B)
    return y
Пример #4
0
def iadil(f, b=None):
    from ia870 import iamat2set, ialimits, iaisbinary
    from ia870 import iaintersec, iagray, iaadd4dil, iasecross

    if b is None: b = iasecross()

    if len(f.shape) == 1: f = f[newaxis, :]
    h, w = f.shape
    x, v = iamat2set(b)
    if len(x) == 0:
        y = (ones((h, w)) * ialimits(f)[0]).astype(f.dtype)
    else:
        if iaisbinary(v):
            v = iaintersec(iagray(v, 'int32'), 0)
        mh, mw = max(abs(x)[:, 0]), max(abs(x)[:, 1])
        y = (ones((h + 2 * mh, w + 2 * mw)) * ialimits(f)[0]).astype(f.dtype)
        for i in range(x.shape[0]):
            if v[i] > -2147483647:
                y[mh + x[i, 0]:mh + x[i, 0] + h,
                  mw + x[i, 1]:mw + x[i, 1] + w] = maximum(
                      y[mh + x[i, 0]:mh + x[i, 0] + h,
                        mw + x[i, 1]:mw + x[i, 1] + w], iaadd4dil(f, v[i]))
        y = y[mh:mh + h, mw:mw + w]

    return y
Пример #5
0
def ialabel_rec(f, Bc=iasecross()):
    assert MT.iaisbinary(f), 'Can only label binary image'
    faux = f.copy()
    label = 1
    y = MT.iagray(f, 'uint16', 0)  # zero image (output)
    x = faux.ravel().nonzero()  # get list of unlabeled pixel
    while len(x[0]):
        fmark = np.zeros_like(f)
        fmark.flat[x[0][0]] = 1  # get the first unlabeled pixel
        r = MT.iainfrec(fmark, faux, Bc)  # detects all pixels connected to it
        faux -= r  # remove them from faux
        r = MT.iagray(r, 'uint16', label)  # label them with the value label
        y = MT.iaunion(y, r)  # merge them with the labeled image
        label = label + 1
        x = faux.ravel().nonzero()  # get list of unlabeled pixel
    return y
Пример #6
0
def ialabel_rec(f, Bc=iasecross()):
    assert MT.iaisbinary(f),'Can only label binary image'
    faux=f.copy()
    label = 1
    y = MT.iagray( f,'uint16',0)          # zero image (output)
    x = faux.ravel().nonzero()            # get list of unlabeled pixel
    while len(x[0]):
        fmark = np.zeros_like(f)
        fmark.flat[x[0][0]] = 1           # get the first unlabeled pixel
        r = MT.iainfrec( fmark, faux, Bc) # detects all pixels connected to it
        faux -= r                         # remove them from faux
        r = MT.iagray( r,'uint16',label)  # label them with the value label
        y = MT.iaunion( y, r)             # merge them with the labeled image
        label = label + 1
        x = faux.ravel().nonzero()        # get list of unlabeled pixel
    return y
Пример #7
0
def iaseshow(B, option="NORMAL"):
    from ia870 import iaisbinary, iaintersec, iagray, iabinary
    from ia870 import iasedil, iaero, iabshow

    option = upper(option)
    if option == "NON-FLAT":
        y = array([0], int32)
        if iaisbinary(B):
            B = iaintersec(iagray(B, "int32"), 0)
    elif option == "NORMAL":
        if iaisbinary(B):
            y = iabinary([1])
        else:
            y = array([0], int32)
    elif option == "EXPAND":
        assert iaisbinary(B), "This option is only available with flat SE"
        y = iasedil(iabinary([1]), B)
        b1 = iabinary(y >= 0)
        b0 = b1 < 0
        b0[shape(b0)[0] / 2, shape(b0)[1] / 2] = 1
        y = iabshow(b1, y, b0)
        return y
    else:
        print "iaseshow: not a valid flag: NORMAL, EXPAND or NON-FLAT"

    y = iasedil(y, B)
    return y
Пример #8
0
def iadist(f, Bc=iasecross(), METRIC=None):
    from ia870 import iagray, iaintersec, iaisequal, iaero, iasebox

    if METRIC is not None: METRIC = METRIC.upper()
    f = iagray(f, 'uint16')
    y = iaintersec(f, 0)
    if (METRIC == 'EUCLIDEAN') or (METRIC == 'EUC2'):
        f = np.int32(f)
        b = np.int32(np.zeros((3, 3)))
        i = 1
        while np.any(f != y):
            a4, a2 = -4 * i + 2, -2 * i + 1
            b = np.int32([[a4, a2, a4], [a2, 0, a2], [a4, a2, a4]])
            y = f
            i = i + 1
            f = iaero(f, b)
        if METRIC == 'EUCLIDEAN':
            y = np.uint16(np.sqrt(f) + 0.5)
    else:
        if iaisequal(Bc, iasecross()):
            b = np.int32([[-2147483647, -1, -2147483647], [-1, 0, -1],
                          [-2147483647, -1, -2147483647]])
        elif iaisequal(Bc, iasebox()):
            b = np.int32([[-1, -1, -1], [-1, 0, -1], [-1, -1, -1]])
        else:
            b = Bc
        while np.any(f != y):
            y = f
            f = iaero(f, b)
    return y
Пример #9
0
def iasedisk(r=3, DIM="2D", METRIC="EUCLIDEAN", FLAT="FLAT", h=0):
    from ia870 import iabinary, iasecross, iasedil, iasesum
    from ia870 import iasebox, iaseintersec, iagray

    METRIC = METRIC.upper()
    FLAT = FLAT.upper()
    assert DIM == '2D', 'Supports only 2D structuring elements'
    if FLAT == 'FLAT': y = iabinary([1])
    else: y = int32([h])
    if r == 0: return y
    if METRIC == 'CITY-BLOCK':
        if FLAT == 'FLAT':
            b = iasecross(1)
        else:
            b = int32([[-2147483647, 0, -2147483647], [0, 1, 0],
                       [-2147483647, 0, -2147483647]])
        return iasedil(y, iasesum(b, r))
    elif METRIC == 'CHESSBOARD':
        if FLAT == 'FLAT':
            b = iasebox(1)
        else:
            b = int32([[1, 1, 1], [1, 1, 1], [1, 1, 1]])
        return iasedil(y, iasesum(b, r))
    elif METRIC == 'OCTAGON':
        if FLAT == 'FLAT':
            b1, b2 = iasebox(1), iasecross(1)
        else:
            b1 = int32([[1, 1, 1], [1, 1, 1], [1, 1, 1]])
            b2 = int32([[-2147483647, 0, -2147483647], [0, 1, 0],
                        [-2147483647, 0, -2147483647]])
        if r == 1: return b1
        else:
            return iasedil(iasedil(y, iasesum(b1, r // 2)),
                           iasesum(b2, (r + 1) // 2))
    elif METRIC == 'EUCLIDEAN':
        v = arange(-r, r + 1)
        x = resize(v, (len(v), len(v)))
        y = transpose(x)
        Be = iabinary(sqrt(x * x + y * y) <= (r + 0.5))
        if FLAT == 'FLAT':
            return Be
        be = h + int32(
            sqrt(maximum((r + 0.5) * (r + 0.5) - (x * x) - (y * y), 0)))
        be = iaintersec(iagray(Be, 'int32'), be)
        return be
    else:
        assert 0, 'Non valid metric'

    return B
Пример #10
0
def iaareaopen_eq(f, a, Bc=iasecross()):

    if f.dtype == np.bool:
      fr = MT.ialabel(f,Bc)      # binary area open, use area measurement
      g = MT.iablob(fr,'area')
      y = g >= a
    else:
      y = np.zeros_like(f)
      k1 = f.min()
      k2 = f.max()
      for k in xrange(k1,k2+1):   # gray-scale, use thresholding decomposition
        fk = (f >= k)
        fo = MT.iaareaopen(fk,a,Bc)
        if not fo.any():
          break
        y = MT.iaunion(y, MT.iagray(fo,f.dtype,k))
    return y
Пример #11
0
def iaareaopen_eq(f, a, Bc=iasecross()):

    if f.dtype == np.bool:
        fr = MT.ialabel(f, Bc)  # binary area open, use area measurement
        g = MT.iablob(fr, "area")
        y = g >= a
    else:
        y = np.zeros_like(f)
        k1 = f.min()
        k2 = f.max()
        for k in xrange(k1, k2 + 1):  # gray-scale, use thresholding decomposition
            fk = f >= k
            fo = MT.iaareaopen(fk, a, Bc)
            if not fo.any():
                break
            y = MT.iaunion(y, MT.iagray(fo, f.dtype, k))
    return y
Пример #12
0
def iagshow(X, X1=None, X2=None, X3=None, X4=None, X5=None, X6=None):
    from ia870 import iaisbinary, iagray, iaunion
    from ia870 import iaintersec, ianeg, iaconcat

    if iaisbinary(X): X = iagray(X, 'uint8')
    r = X
    g = X
    b = X
    if X1 is not None:  # red 1 0 0
        assert iaisbinary(X1), 'X1 must be binary overlay'
        x1 = iagray(X1, 'uint8')
        r = iaunion(r, x1)
        g = iaintersec(g, ianeg(x1))
        b = iaintersec(b, ianeg(x1))
    if X2 is not None:  # green 0 1 0
        assert iaisbinary(X2), 'X2 must be binary overlay'
        x2 = iagray(X2, 'uint8')
        r = iaintersec(r, ianeg(x2))
        g = iaunion(g, x2)
        b = iaintersec(b, ianeg(x2))
    if X3 is not None:  # blue 0 0 1
        assert iaisbinary(X3), 'X3 must be binary overlay'
        x3 = iagray(X3, 'uint8')
        r = iaintersec(r, ianeg(x3))
        g = iaintersec(g, ianeg(x3))
        b = iaunion(b, x3)
    if X4 is not None:  # magenta 1 0 1
        assert iaisbinary(X4), 'X4 must be binary overlay'
        x4 = iagray(X4, 'uint8')
        r = iaunion(r, x4)
        g = iaintersec(g, ianeg(x4))
        b = iaunion(b, x4)
    if X5 is not None:  # yellow 1 1 0
        assert iaisbinary(X5), 'X5 must be binary overlay'
        x5 = iagray(X5, 'uint8')
        r = iaunion(r, x5)
        g = iaunion(g, x5)
        b = iaintersec(b, ianeg(x5))
    if X6 is not None:  # cyan 0 1 1
        assert iaisbinary(X6), 'X6 must be binary overlay'
        x6 = iagray(X6, 'uint8')
        r = iaintersec(r, ianeg(x6))
        g = iaunion(g, x6)
        b = iaunion(b, x6)
    return np.array([r, g, b])
    return Y