File size: 5,004 Bytes
6c0075d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116


from __future__ import division

import cv2
import numpy as np
from skimage import morphology
np.seterr(divide='ignore', invalid='ignore')

"""This is the profiled code, very fast, takes 0.25s"""
def fakePad(Image, Mask, iterations=50):
    """

    add an extra padding around the front mask

    :param Image:

    :param Mask:

    :param iterations:

    :return: DilatedImg

    """

    if len(Image.shape) == 3: ##for RGB Image
        """for RGB Images"""

        Mask0 = Mask.copy()
        height, width = Mask0.shape[:2]
        Mask0[0, :] = 0  # np.zeros(width)
        Mask0[-1, :] = 0  # np.zeros(width)
        Mask0[:, 0] = 0  # np.zeros(height)
        Mask0[:, -1] = 0  # np.zeros(height)

        # Erodes the mask to avoid weird region near the border.
        structureElement1 = morphology.disk(5)
        Mask0 = cv2.morphologyEx(Mask0, cv2.MORPH_ERODE, structureElement1, iterations=1)

        # DilatedImg = Img_green_reverse * Mask
        DilatedImg = cv2.bitwise_and(Image, Image, mask=Mask0)
        OldMask = Mask0.copy()

        filter = np.ones((3, 3))
        filterRows, filterCols = np.where(filter > 0)
        filterRows = filterRows - 1
        filterCols = filterCols - 1

        structureElement2 = morphology.diamond(1)
        for i in range(0, iterations):
            NewMask = cv2.morphologyEx(OldMask, cv2.MORPH_DILATE, structureElement2, iterations=1)
            pixelIndex = np.where(NewMask - OldMask)  # [rows, cols]
            imgValues = np.zeros((len(pixelIndex[0]), len(filterRows), 3))
            for k in range(len(filterRows)):
                filterRowIndexes = pixelIndex[0] - filterRows[k]
                filterColIndexes = pixelIndex[1] - filterCols[k]

                selectMask0 = np.bitwise_and(np.bitwise_and(filterRowIndexes < height, filterRowIndexes >= 0),
                                             np.bitwise_and(filterColIndexes < width, filterColIndexes >= 0))
                selectMask1 = OldMask[filterRowIndexes[selectMask0], filterColIndexes[selectMask0]] > 0
                selectedPositions = [filterRowIndexes[selectMask0][selectMask1],
                                     filterColIndexes[selectMask0][selectMask1]]
                imgValues[np.arange(len(pixelIndex[0]))[selectMask0][selectMask1], k, :] = DilatedImg[
                                                                                           selectedPositions[0],
                                                                                           selectedPositions[1], :]

            DilatedImg[pixelIndex[0], pixelIndex[1], :] = np.sum(imgValues, axis=1) // np.sum(imgValues > 0, axis=1)

            OldMask = NewMask

        return DilatedImg

    ########################################################################

    else:   #for green channel only
        """for green channel only"""

        Mask0 = Mask.copy()
        height, width = Mask0.shape
        Mask0[0, :] = 0  # np.zeros(width)
        Mask0[-1, :] = 0  # np.zeros(width)
        Mask0[:, 0] = 0  # np.zeros(height)
        Mask0[:, -1] = 0  # np.zeros(height)

        # Erodes the mask to avoid weird region near the border.
        structureElement1 = morphology.disk(5)
        Mask0 = cv2.morphologyEx(Mask0, cv2.MORPH_ERODE, structureElement1, iterations=1)

        # DilatedImg = Img_green_reverse * Mask
        DilatedImg = cv2.bitwise_and(Image, Image, mask=Mask0)

        OldMask = Mask0.copy()

        filter = np.ones((3, 3))
        filterRows, filterCols = np.where(filter > 0)
        filterRows = filterRows - 1
        filterCols = filterCols - 1

        structureElement2 = morphology.diamond(1)
        for i in range(0, iterations):
            NewMask = cv2.morphologyEx(OldMask, cv2.MORPH_DILATE, structureElement2, iterations=1)
            pixelIndex = np.where(NewMask - OldMask)  # [rows, cols]

            imgValues = np.zeros((len(pixelIndex[0]), len(filterRows)))
            for k in range(len(filterRows)):
                filterRowIndexes = pixelIndex[0] - filterRows[k]
                filterColIndexes = pixelIndex[1] - filterCols[k]

                selectMask0 = np.bitwise_and(np.bitwise_and(filterRowIndexes < height, filterRowIndexes >= 0),
                                             np.bitwise_and(filterColIndexes < width, filterColIndexes >= 0))
                selectMask1 = OldMask[filterRowIndexes[selectMask0], filterColIndexes[selectMask0]] > 0
                selectedPositions = [filterRowIndexes[selectMask0][selectMask1], filterColIndexes[selectMask0][selectMask1]]
                imgValues[np.arange(len(pixelIndex[0]))[selectMask0][selectMask1], k] = DilatedImg[selectedPositions[0], selectedPositions[1]]

            DilatedImg[pixelIndex[0], pixelIndex[1]] = np.sum(imgValues, axis=1) / np.sum(imgValues > 0, axis=1)

            OldMask = NewMask

        return DilatedImg