# importy from __future__ import division from pylab import * import skimage from skimage import data, filters, exposure, feature, morphology from skimage.morphology import square from skimage.filters import rank from skimage.util.dtype import convert from skimage import img_as_float, img_as_ubyte from matplotlib.pyplot import imshow import skimage.io as io from skimage.color import rgb2hsv, hsv2rgb, rgb2gray, gray2rgb from skimage.filters.edges import convolve from matplotlib import pylab as plt import numpy as np from numpy import array from IPython.display import display from ipywidgets import interact, interactive, fixed from IPython.core.display import clear_output import os import cv2 import warnings warnings.simplefilter("ignore") # funkcja do generowania krotki 3-elementowej z randomowym kolorem def generate_color(): return (randint(0,255), randint(0,255), randint(0,255)) # Funkcja do znajdywania konturów na pojedynczym obrazku. # Najpierw stosujemy funkcje do obróbki zdjęcia w celu uwydatnienia krawędzi, # a następnie szukamy kontury i rysujemy je, jeśli są konturem zewnętrznym i jeśli są większe niż zadana wielkość. # Dodatkowo obliczamy też centroid każdego konturu. def fun(plane, im, canny_first, canny_second, coef_blur, count_morph, size, width): imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) imgray = cv2.medianBlur(imgray, coef_blur) imgray = cv2.Canny(imgray, canny_first, canny_second) kernel = np.ones((5,5),np.uint8) imgray = cv2.dilate(imgray,kernel,iterations = count_morph) imgray = cv2.erode(imgray,kernel,iterations = count_morph) img, contours, hierarchy = cv2.findContours(imgray,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) hier = hierarchy[0] moments = [] for i in range(len(hier)): if(hier[i][3] == -1): if(len(contours[i]) > size): M = cv2.moments(contours[i]) moments.append([int(M['m10']/M['m00']), int(M['m01']/M['m00'])]) cv2.drawContours(plane, contours, i, generate_color(), width, hierarchy=hierarchy, maxLevel=0) return plane, moments # Główna funkcja w programie. # Wczytuje kolejno każdy plik ze zdjęciem samolotu, wywołuje dla niego funkcję fun() i wyświetla rezultat. # Dorysowuje również centroidy w punktach zwróconych przez fun(). def load(n, col, canny_first, canny_second, coef_blur, count_morph, size, width, marker): fig, axes = plt.subplots(nrows=n//col, ncols=col, figsize=(30,7*(n//col))) no = 0 for ax in axes: for i in range(col): if(no < 10): file = os.getcwd() + '//planes/samolot0' + str(no) + '.jpg' else: file = os.getcwd() + '//planes/samolot' + str(no) + '.jpg' plane = data.load(file) im = cv2.imread(file) result, moments = fun(plane, im, canny_first, canny_second, coef_blur, count_morph, size, width) ax[i].imshow(result, cmap='gray') for mom in moments: ax[i].plot([mom[0]], [mom[1]], 'wo', markersize=marker) no = no + 1 fig.savefig('planes.pdf') # Wywołanie głównej funkcji programu z zadanymi parametrami load(21, 3, 100, 200, 3, 1, 95, 3, 5)