Добавил:
chrysler_a57_mltbnk
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
import os
import skimage
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
from threading import Thread
import time
#Создание класса-наследника класса Thread с возвращением элементов
class ThreadRV(Thread):
def __init__(self, group=None, target=None, name=None,
args=(), kwargs={}, Verbose=None):
Thread.__init__(self, group, target, name, args, kwargs)
self._return = None
def run(self):
if self._target is not None:
self._return = self._target(*self._args, ** self._kwargs)
def result(self):
return self._return
#Функция вызова потоков
def thrd_call(trg, argnt1, argnt2, a):
thread1 = ThreadRV(target=trg, args =argnt1)
thread2 = ThreadRV(target=trg, args =argnt2)
thread1.start()
thread2.start()
if a == False:
thread2.join()
thread1.join()
elif a == True:
thread1.join()
thread2.join()
return (thread1.result(), thread2.result())
#Функция считывания названий файлов
def f_name(s):
lt = os.listdir(s)
return lt
#Функция создания списков изображений
def img_read(ls, path):
array = []
for i in ls:
array.append(np.array(skimage.io.imread(f'{path}/{i}')))
return array
#Функция «спрямления» изображений
def img_flatten(ls):
for i in ls:
i.shape = (len(i)*len(i[0])*3)
i = i.T
#Функция нормирования параметров
def norm(arr,mn,st):
for i in range(len(arr)):
arr[i] = (arr[i] - mn[i])/st[i]
#Очистка окна консоли
os.system('cls')
#Запуск таймера
t1 = time.perf_counter_ns()
#Создание списков названий файлов в папках
trees_list, no_trees_list = thrd_call(f_name,\
("Trees",), ("NoTrees",), True)
#Создание списков изображений в папке
trees_img_list, no_trees_img_list = thrd_call(img_read,\
(trees_list, "Trees"), (no_trees_list, "NoTrees"), True)
#Создание массива изображений
##«Спрямление» массивов изображений
thrd_call(img_flatten, (trees_img_list,),
(no_trees_img_list,), False)
##Объединение массивов в один
X = np.vstack((np.array(trees_img_list[0:len(trees_img_list)+1]),
np.array(no_trees_img_list[0:len(no_trees_img_list)+1])))
X = X.astype('float64')
#Метод главных кординат
##Максимальное количество параметров
max_par = 2
##Среднее нормирование
mean = np.mean(X.T, axis=1)
std = np.std(X.T, axis=1)
norm(X.T,mean,std)
##Создание ковариционной матрицы
if os.path.isfile('sigma.npy') == True:
sigma = np.load('sigma.npy')
elif os.path.isfile('sigma.npy') == False:
sigma = np.cov(X.T,bias=True)
np.save('sigma.npy', sigma)
##Создание матрицы собственных векторов для ковариационной матрицы
if os.path.isfile('U_matrix.npy') == True:
U = np.load('U_matrix.npy')
elif os.path.isfile('U_matrix.npy') == False:
U, S, Vh = np.linalg.svd(sigma)
np.save('U_matrix.npy', U)
U_r = U[::,:max_par:] #Создание матрицы преобразований
X_cmprs = X@U_r #Компрессия изображений
#Построение изображений в двух главных координатах
plt.figure(1)
plt.scatter(X_cmprs.T[0],X_cmprs.T[1],alpha=0.3)
plt.title("Изображения в двух главных координатах")
#Метод K-means
k = 3 #количество кластеров
CK = np.array(np.copy([X_cmprs[0],X_cmprs[1],X_cmprs[2]])) #массив центроидов
dist = np.zeros((len(X_cmprs),k)) #массив расстояний
K_number = 0
##Кластеризаця
tmp = np.zeros((k,max_par))
while np.all(tmp == CK) == False:
tmp = np.copy(CK)
##Вычисление расстояний до изображений
for i in range(0,k):
dist.T[i] = (X_cmprs.T[0]-CK[i][0])**2 + (X_cmprs.T[1]-CK[i][1])**2
MinDist = np.argmin(dist, axis=1) #определение минимального расстояния
##Обновление центров кластеров
for i in range(0,k):
CK[i] = np.mean(X_cmprs[MinDist==i,:],axis=0)
K_number = np.copy(MinDist)
#Вывод графиков на экран
plt.figure(2)
for i in range(k):
plt.scatter(X_cmprs[K_number==i,0], X_cmprs[K_number==i,1], alpha=0.4, label=f'{i+1} кластер')
plt.title('Кластеризованные Изображения в двух координатах')
plt.legend()
#Вывод времени выполнения программы
print(f'\nTotal program execution time: \
{(time.perf_counter_ns()-t1)/10**9:.5f} seconds.')
plt.show()
Соседние файлы в папке лабы
