# 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)