- # 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('planesAll.pdf')
- # Wywołanie głównej funkcji programu z zadanymi parametrami
- load(21, 3, 100, 200, 3, 1, 95, 3, 5)