{"cells":[{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport cv2\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom skimage.data import imread\nimport matplotlib.pyplot as plt\nfrom mpl_toolkits.mplot3d import Axes3D\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\n#print(os.listdir(\"C:\\\\Users\\\\admin\\\\AppData\\\\Roaming\\\\jupyter\\\\input\"))\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"train = os.listdir('../input/train')\nprint(len(train))\n\ntest = os.listdir('../input/test')\nprint(len(test))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"c6dbe55d09328048f5f7b98aedd8eaa8f68a3751","trusted":true},"cell_type":"code","source":"submission = pd.read_csv('../input/sample_submission.csv')\nsubmission.head()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"6122ccb9e58bfac6fa5e11c86121e78d9e5151b1","trusted":true},"cell_type":"code","source":"# ref: https://www.kaggle.com/paulorzp/run-length-encode-and-decode\ndef rle_decode(mask_rle, shape=(768, 768)):\n    '''\n    mask_rle: run-length as string formated (start length)\n    shape: (height,width) of array to return \n    Returns numpy array, 1 - mask, 0 - background\n\n    '''\n    s = mask_rle.split()\n    starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])]\n    starts -= 1\n    ends = starts + lengths\n    img = np.zeros(shape[0]*shape[1], dtype=np.uint8)\n    for lo, hi in zip(starts, ends):\n        img[lo:hi] = 1\n    return img.reshape(shape).T  # Needed to align to RLE direction","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"206104f888afa9c62a0bbcb45229f58111094f18","trusted":true},"cell_type":"code","source":"masks = pd.read_csv('../input/train_ship_segmentations.csv')\nmasks.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"639688d1e552163d75e89cdefa90954cbc91b47f"},"cell_type":"code","source":"from sklearn.cluster import KMeans\nclass DominantColors:\n\n    CLUSTERS = None\n    IMAGE = None\n    COLORS = None\n    LABELS = None\n    IMAGES = None\n    INPUT = None\n    FREQUENCY = None\n    HSV = None\n    BGR = None\n    GRAY = None\n    \n    def __init__(self, image, clusters=8):\n        self.IMAGES = {}\n        self.CLUSTERS = clusters\n        self.IMAGE = image\n        self.INPUT = cv2.imread(self.IMAGE)\n        self.IMAGES['00_original RGB'] = cv2.cvtColor(self.INPUT, cv2.COLOR_BGR2RGB)\n        self.INPUT = cv2.cvtColor(self.INPUT, cv2.COLOR_BGR2HLS)\n        self.IMAGES['10_converted CMAP'] = self.INPUT\n\n    def dominantColors(self):\n        self.SMALL = cv2.pyrDown(self.INPUT)\n        Z = self.SMALL.reshape((-1,3))\n\n        # convert to np.float32\n        Z = np.float32(Z)\n\n        # define criteria, number of clusters(K) and apply kmeans()\n        criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)\n        ret,self.LABELS,self.COLORS=cv2.kmeans(Z,self.CLUSTERS,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)\n        #print(self.COLORS)\n        #print('HSV color:', self.COLORS)        \n\n    def calcFrequency(self):\n        #labels form 0 to no. of clusters\n        numLabels = np.arange(0, self.CLUSTERS+1)\n        #create frequency count tables    \n        (hist, _) = np.histogram(self.LABELS, bins = numLabels)\n        hist = hist.astype(\"float\")\n        hist /= hist.sum()\n        \n        #appending frequencies to cluster centers\n        colors = self.COLORS\n        \n        #descending order sorting as per frequency count\n        colors = colors[(-hist).argsort()]\n        hist = hist[(-hist).argsort()]\n        self.MAX = hist[0]\n        return zip(colors,hist)\n\n    def equalizeHistogram(self):\n        H, S, V = cv2.split(cv2.cvtColor(cv2.cvtColor(self.INPUT, cv2.COLOR_HLS2BGR), cv2.COLOR_BGR2HSV))\n        eq_V = cv2.equalizeHist(V)\n        self.INPUT = cv2.merge([H, S, eq_V])\n        self.INPUT = cv2.cvtColor(cv2.cvtColor(self.INPUT, cv2.COLOR_HSV2BGR), cv2.COLOR_BGR2HLS)\n        self.IMAGES['20_equalized HLS'] = self.INPUT\n\n    def denoiseImage(self):\n        self.INPUT = cv2.fastNlMeansDenoisingColored(self.INPUT,None,8,10,7,21)\n        self.IMAGES['30_denoised HLS'] = self.INPUT        \n    \n    def filterMeans(self, COLOR):\n        lower_h = np.clip(COLOR[0]-7,  0, 180)\n        upper_h = np.clip(COLOR[0]+7,  0, 180)\n        lower_color = np.array([lower_h,1,1])\n        upper_color = np.array([upper_h,255,255])\n        mask_cv = cv2.inRange(self.INPUT, lower_color, upper_color)\n        mask_cv = 255-mask_cv\n        self.INPUT = cv2.bitwise_and(self.INPUT,self.INPUT,mask=mask_cv)\n        self.IMAGES['40_means_removed HLS'] = self.INPUT \n\n    def filterClouds(self):\n        lower_h = 0\n        lower_l = 240\n        lower_s = 0\n        upper_h = 255\n        upper_l = 255\n        upper_s = 255\n        lower_color = np.array([lower_h,lower_l,lower_s])\n        upper_color = np.array([upper_h,upper_l,upper_s])\n        mask_kmeans = cv2.inRange(self.INPUT, lower_color, upper_color)\n        mask_kmeans = 255-mask_kmeans\n        self.INPUT = cv2.bitwise_and(self.INPUT,self.INPUT,mask=mask_kmeans)\n        self.IMAGES['41_clouds_removed HLS'] = self.INPUT\n        \n    # processImage\n    def plotImage(self):\n        self.plotHistogram()\n        #self.denoiseImage()\n        #self.equalizeHistogram()\n        for COLOR, FREQUENCY in self.calcFrequency():\n            #print(ImageId, ': ', COLOR, FREQUENCY)\n            if FREQUENCY > 0.022:\n                self.filterMeans(COLOR)\n                print('Removed color:', COLOR, 'with frequency:', FREQUENCY)   \n            # finally filter clouds, prevents black from becoming biggest k-mean\n            #self.filterClouds()\n\n        self.BLUR = cv2.medianBlur(self.INPUT,5)        \n        #self.BLUR = self.INPUT\n                \n        ### find contours\n        kernel = np.ones((5,5),np.uint8)\n        cimage = cv2.cvtColor(self.BLUR, cv2.COLOR_HLS2BGR)\n        cimage = cv2.cvtColor(cimage, cv2.COLOR_BGR2GRAY)\n        closing = cv2.morphologyEx(cimage, cv2.MORPH_GRADIENT, kernel,iterations = 2 )\n        self.IMAGES['50_morph_gradient'] = closing.astype(np.uint8)\n        kernel = np.ones((5,5),np.uint8)\n        closing = cv2.erode(closing,kernel,iterations = 2)\n        \n        im2,contours,hierarchy = cv2.findContours(closing, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)\n        \n        contours = sorted(contours, key = cv2.contourArea, reverse = True)\n        closing = cv2.cvtColor(closing, cv2.COLOR_GRAY2RGB)\n        for contour in contours:\n            area = cv2.contourArea(contour)\n            if area > 10 and area < 15000:\n                \n                rect = cv2.minAreaRect(contour)\n                box = cv2.boxPoints(rect)\n                box = np.int0(box)\n                cv2.drawContours(closing,[box],0,(0,0,255),2)\n        self.IMAGES['99_result'] = closing\n        self.dominantColors()\n        self.calcFrequency()\n        if self.MAX > 0.98:\n            self.plotHistogram()\n            for key,OUTPUTIMAGE in self.IMAGES.items():\n                print(key)\n                if key.endswith('HLS'):\n                    plt.figure()\n                    plt.axis(\"off\")\n                    plt.imshow(cv2.cvtColor(OUTPUTIMAGE, cv2.COLOR_HLS2RGB))\n                    plt.show()   \n                elif key.endswith('BGR'):\n                    plt.figure()\n                    plt.axis(\"off\")\n                    plt.imshow(cv2.cvtColor(OUTPUTIMAGE, cv2.COLOR_BGR2RGB))\n                    plt.show()   \n                elif key.endswith('CMAP'):\n                    plt.figure()\n                    plt.axis(\"off\")\n                    plt.imshow(OUTPUTIMAGE,cmap='hot')\n                    plt.show()   \n                else:\n                    plt.figure()\n                    plt.axis(\"off\")\n                    plt.imshow(OUTPUTIMAGE)\n                    plt.show()   \n\n    # optional\n    def plotHistogram(self):\n        #labels form 0 to no. of clusters\n        numLabels = np.arange(0, self.CLUSTERS+1)\n        #create frequency count tables    \n        (hist, _) = np.histogram(self.LABELS, bins = numLabels)\n        hist = hist.astype(\"float\")\n        hist /= hist.sum()\n        \n        #appending frequencies to cluster centers\n        colors = self.COLORS\n        \n        #descending order sorting as per frequency count\n        colors = colors[(-hist).argsort()]\n        hist = hist[(-hist).argsort()] \n\n        #creating empty chart\n        chart = np.zeros((50, 500, 3), np.uint8)\n        start = 0\n\n        #creating color rectangles\n        for i in range(self.CLUSTERS):\n            end = start + hist[i] * 500\n            \n            #getting rgb values\n            h = int(colors[i][0])\n            s = int(colors[i][1])\n            v = int(colors[i][2])\n            \n            #using cv2.rectangle to plot colors\n            cv2.rectangle(chart, (int(start), 0), (int(end), 50), (h,s,v), -1)\n            start = end\n\n        #display chart\n        plt.figure()\n        plt.axis(\"off\")\n        plt.imshow(cv2.cvtColor(chart, cv2.COLOR_HLS2RGB))\n        plt.show()\n\ndef remove_white(img_hsv, sensitivity):\n    lower_white = np.array([0,0,255-sensitivity])\n    upper_white = np.array([255,sensitivity,255])    \n\n    # Threshold the HSV image to get only white colors\n    mask_cv = cv2.inRange(img_hsv, lower_white, upper_white)\n    mask_cv = 255-mask_cv\n    # Bitwise-OR mask and original image\n    return cv2.bitwise_or(img_hsv,img_hsv,mask=mask_cv)\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"63e18e8573dbb3fe1d3ff1d72b6dc756e067d43a","trusted":true},"cell_type":"code","source":"images = os.listdir('../input/train')[0:20]\nall = len(images)\ncount = 0\nfor ImageId in images:    # masks.head(200)['ImageId']: # .head(200) \n    count = count + 1\n    img_masks = masks.loc[masks['ImageId'] == ImageId, 'EncodedPixels'].tolist()\n    if len(img_masks)>0:\n        print('Done %s / %s' % (count,all))\n        # Take the individual ship masks and create a single mask array for all ships\n        all_masks = np.zeros((768, 768))\n        for mask in img_masks:\n            try:\n                all_masks += rle_decode(mask)\n            except:\n                break\n\n        print('=================================================================')\n        print('Initializing...')\n        dc = DominantColors('../input/train/' + ImageId, 8) \n        print('Dominant colors...')\n        colors = dc.dominantColors()\n        print('Plotting...')\n        dc.plotImage()\n        print('=================================================================')\n        \n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6bafc826cc0e3345787606d56bedeafd598d0951"},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b3e31fdd69f170e3017a5819b93b57b5e44d4a4c"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"widgets":{"state":{},"version":"1.1.2"}},"nbformat":4,"nbformat_minor":1}