diff --git a/lab2_1/lab2_1.py b/lab2_1/lab2_1.py index b3e7937..d5aae29 100644 --- a/lab2_1/lab2_1.py +++ b/lab2_1/lab2_1.py @@ -1,161 +1,162 @@ import os import sys +import traceback + import cv2 import numpy as np from matplotlib import pyplot as plt -def menu(): - print("Выберите пункт меню:\n1.Linear filter\n2.Blur\n3.Median blur\n4.GaussianBlur\n5.Erode") - print("6.Dilate\n7.MORPH_OPERATIONS\n8.Sobel\n9.Laplacian\n10.Canny\n11.CalcHist\n12.EqualizeHist") - print("13.Save\n14.Add Figure\n15.Del Figure\n16.Exit") +SOURCE_IMAGE = "test.jpg" + + +def filter_linear(image): + kernel = np.array([[-0.1, 0.2, -0.1], [0.2, 3.0, 0.2], [-0.1, 0.2, -0.1]]) + cv2.imshow("Исходное изображение", image) + cv2.imshow("Результат", cv2.filter2D(image.copy(), -1, kernel)) + + +def filter_blur(image): + cv2.imshow("Исходное изображение", image) + cv2.imshow("Результат", cv2.blur(image.copy(), (5, 5))) + + +def filter_median_blur(image): + cv2.imshow("Исходное изображение", image) + cv2.imshow("Результат", cv2.medianBlur(image.copy(), 5)) + + +def filter_gauss_blur(image): + cv2.imshow("Исходное изображение", image) + cv2.imshow("Результат", cv2.GaussianBlur(image.copy(), (9, 9), cv2.BORDER_DEFAULT)) + + +def filter_erode(image): + cv2.imshow("Исходное изображение", image) + cv2.imshow("Результат", cv2.erode(image.copy(), np.ones((11, 11)))) + + +def filter_dilate(image): + cv2.imshow("Исходное изображение", image) + cv2.imshow("Результат", cv2.dilate(image.copy(), np.ones((11, 11)))) + + +def filter_morph(image): + # TODO переписать + image2 = image.copy() + image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) + cv2.imshow("Image_load", image) + kernel = np.ones((6, 6), np.uint8) + image3 = cv2.morphologyEx(image3, cv2.MORPH_OPEN, kernel, iterations=1) + cv2.imshow("MORPH_OPEN", image3) + image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) + image3 = cv2.morphologyEx(image3, cv2.MORPH_CLOSE, kernel, iterations=1) + cv2.imshow("MORPH_CLOSE", image3) + image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) + image3 = cv2.morphologyEx(image3, cv2.MORPH_GRADIENT, kernel, iterations=1) + cv2.imshow("MORPH_GRADIENT", image3) + image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) + image3 = cv2.morphologyEx(image3, cv2.MORPH_TOPHAT, kernel, iterations=1) + cv2.imshow("MORPH_TOPHAT", image3) + image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) + image3 = cv2.morphologyEx(image3, cv2.MORPH_BLACKHAT, kernel, iterations=1) + cv2.imshow("MORPH_BLACKHAT", image3) + image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) + + +def filter_sobel(image): + image2 = image.copy() + image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) + image3 = cv2.GaussianBlur(image3, (3, 3), 0) + im3 = cv2.Sobel(image3, cv2.CV_64F, 1, 0, ksize=5) + im4 = cv2.Sobel(image3, cv2.CV_64F, 0, 1, ksize=5) + im5 = cv2.Sobel(image3, cv2.CV_8UC1, 0, 1, ksize=5) + cv2.imshow("Image_load", image) + cv2.imshow("Result_Image_X", im3) # x + cv2.imshow("Result_Image_Y", im4) # y + cv2.imshow("Result_Gradient", im5) # gradient + + +def filter_laplacian(image): + image2 = image.copy() + image3 = cv2.cvtColor(image2, cv2.COLOR_RGB2GRAY) + image3 = cv2.GaussianBlur(image3, (3, 3), 0) + im3 = cv2.Laplacian(image3, cv2.CV_64F) + cv2.imshow("Image_load", image) + cv2.imshow("Result_Image", im3) + + +def filter_canny(image): + image2 = image.copy() + image3 = cv2.blur(image2, (5, 5)) + image3 = cv2.Canny(image3, 100, 100) + cv2.imshow("Image_load", image) + cv2.imshow("Result_Image", image3) + + +def filter_calc_hist(image): + image2 = image.copy() + color = ('b', 'g', 'r') + cv2.imshow("Image_load", image) + for i, col in enumerate(color): + histr = cv2.calcHist([image2], [i], None, [256], [0, 256]) + plt.plot(histr, color=col) + plt.xlim([0, 256]) + plt.show() + plt.close() + + +def filter_equalize_hist(image): + cv2.imshow("Исходное изображение", image) + cv2.imshow("Результат", cv2.equalizeHist(cv2.cvtColor(image.copy(), cv2.COLOR_RGB2GRAY))) + + +functions_list = { + "lf": {"func": filter_linear, "help": "Linear filter"}, + "bl": {"func": filter_blur, "help": "Blur"}, + "mb": {"func": filter_median_blur, "help": "Median blur"}, + "gb": {"func": filter_gauss_blur, "help": "GaussianBlur"}, + "er": {"func": filter_erode, "help": "Erode"}, + "di": {"func": filter_dilate, "help": "Dilate"}, + "mo": {"func": filter_morph, "help": "MORPH_OPERATIONS"}, + "so": {"func": filter_sobel, "help": "Sobel"}, + "la": {"func": filter_laplacian, "help": "Laplacian"}, + "ca": {"func": filter_canny, "help": "Canny"}, + "cl": {"func": filter_calc_hist, "help": "CalcHist"}, + "eh": {"func": filter_equalize_hist, "help": "EqualizeHist"}, + "q": {"func": lambda image: sys.exit(0), "help": "Exit"}, +} + + +def print_help(): + print("Доступные функции:") + for k in functions_list: + print(f" {k} - {functions_list[k]['help']}") def main(): - image1 = cv2.imread("D:\\MACH\\LAB_2\\image0.jpg") - image2 = image1.copy() - im = image1.copy() + image1 = cv2.imread(SOURCE_IMAGE) while True: - menu() try: - s = int(input()) - if s == 1: - image2 = image1.copy() - kernel = np.array([[-0.1, 0.2, -0.1], [0.2, 3.0, 0.2], [-0.1, 0.2, -0.1]]) - image2 = cv2.filter2D(image2, -1, kernel) - cv2.imshow("Image_load", image1) - cv2.imshow("Result_Image", image2) - cv2.waitKey(0) - if s == 2: - image2 = image1.copy() - image2 = cv2.blur(image2, (5, 5)) - cv2.imshow("Image_load", image1) - cv2.imshow("Result_Image", image2) - cv2.waitKey(0) - if s == 3: - image2 = image1.copy() - image2 = cv2.medianBlur(image2, 5) - cv2.imshow("Image_load", image1) - cv2.imshow("Result_Image", image2) - cv2.waitKey(0) - if s == 4: - image2 = image1.copy() - image2 = cv2.GaussianBlur(image2, (9, 9), cv2.BORDER_DEFAULT) - cv2.imshow("Image_load", image1) - cv2.imshow("Result_Image", image2) - cv2.waitKey(0) - if s == 5: - image2 = image1.copy() - image2 = cv2.erode(image2, np.ones((11, 11))) - cv2.imshow("Image_load", image1) - cv2.imshow("Result_Image", image2) - cv2.waitKey(0) - if s == 6: - image2 = image1.copy() - image2 = cv2.dilate(image2, np.ones((11, 11))) - cv2.imshow("Image_load", image1) - cv2.imshow("Result_Image", image2) - cv2.waitKey(0) - if s == 7: - image2 = image1.copy() - image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) - cv2.imshow("Image_load", image1) - kernel = np.ones((6, 6), np.uint8) - image3 = cv2.morphologyEx(image3, cv2.MORPH_OPEN, kernel, iterations=1) - cv2.imshow("MORPH_OPEN", image3) - image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) - image3 = cv2.morphologyEx(image3, cv2.MORPH_CLOSE, kernel, iterations=1) - cv2.imshow("MORPH_CLOSE", image3) - image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) - image3 = cv2.morphologyEx(image3, cv2.MORPH_GRADIENT, kernel, iterations=1) - cv2.imshow("MORPH_GRADIENT", image3) - image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) - image3 = cv2.morphologyEx(image3, cv2.MORPH_TOPHAT, kernel, iterations=1) - cv2.imshow("MORPH_TOPHAT", image3) - image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) - image3 = cv2.morphologyEx(image3, cv2.MORPH_BLACKHAT, kernel, iterations=1) - cv2.imshow("MORPH_BLACKHAT", image3) - image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) - cv2.waitKey(0) - if s == 8: - image2 = image1.copy() - image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) - image3 = cv2.GaussianBlur(image3, (3, 3), 0) - im3 = cv2.Sobel(image3, cv2.CV_64F, 1, 0, ksize=5) - im4 = cv2.Sobel(image3, cv2.CV_64F, 0, 1, ksize=5) - im5 = cv2.Sobel(image3, cv2.CV_8UC1, 0, 1, ksize=5) - cv2.imshow("Image_load", image1) - cv2.imshow("Result_Image_X", im3) # x - cv2.imshow("Result_Image_Y", im4) # y - cv2.imshow("Result_Gradient", im5) # gradient - cv2.waitKey(0) - if s == 9: - image2 = image1.copy() - image3 = cv2.cvtColor(image2, cv2.COLOR_RGB2GRAY) - image3 = cv2.GaussianBlur(image3, (3, 3), 0) - im3 = cv2.Laplacian(image3, cv2.CV_64F) - cv2.imshow("Image_load", image1) - cv2.imshow("Result_Image", im3) # x - cv2.waitKey(0) - if s == 10: - image2 = image1.copy() - image3 = cv2.cvtColor(image2, cv2.COLOR_RGB2GRAY) - image3 = cv2.blur(image2, (5, 5)) - image3 = cv2.Canny(image3, 100, 100) - cv2.imshow("Image_load", image1) - cv2.imshow("Result_Image", image3) # x - cv2.waitKey(0) - if s == 11: - image2 = image1.copy() - color = ('b', 'g', 'r') - cv2.imshow("Image_load", image1) - for i, col in enumerate(color): - histr = cv2.calcHist([image2], [i], None, [256], [0, 256]) - plt.plot(histr, color=col) - plt.xlim([0, 256]) - plt.show() - plt.close() - cv2.waitKey(0) - if s == 12: - image2 = image1.copy() - image2 = cv2.cvtColor(image2, cv2.COLOR_RGB2GRAY) - image2 = cv2.equalizeHist(image2) - cv2.imshow("Image_load", image1) - cv2.imshow("Result_Image", image2) - cv2.waitKey(0) - if s == 13: - cv2.imshow("Image_load", image1) - cv2.imshow("Result_Image", image2) - cv2.imwrite("D:\\im1.jpg", image1) - cv2.imwrite("D:\\im2.jpg", image2) - cv2.waitKey(0) - if s == 14: - image2 = image1.copy() - cv2.imshow("Image_load", image1) - image2 = cv2.line(image2, (15, 15), (270, 270), (76, 187, 23), 10) # линия - image2 = cv2.rectangle(image2, (20, 20), (100, 100), (0, 0, 255), 10) # нарисуем четырехугольник - image2 = cv2.circle(image2, (100, 100), 40, (0, 255, 0), 10) # нарисуем круг - cv2.imshow("Result_Image", image2) - image1 = image2 - cv2.waitKey(0) - if s == 15: - cv2.imwrite("1.jpg", im) - cv2.imwrite("2.jpg", image1) - img = cv2.imread("1.jpg") - mask = cv2.imread("2.jpg", 0) - res = cv2.bitwise_and(img, img, mask=mask) - image2 = res.copy() - image1 = res.copy() - cv2.imshow("Result_Image", res) + cmd = input(">> ") + if cmd == "": + continue + elif cmd == "?": + print_help() + else: + if cmd in functions_list: + try: + functions_list[cmd]["func"](image=image1.copy()) + cv2.waitKey(0) + cv2.destroyAllWindows() + except Exception: + print("Произошла ошибка при выполнении функции") + traceback.print_exc() + else: + print("Функция не найдена! введите '?' для получения справки") - cv2.waitKey(0) - os.remove("1.jpg") - os.remove("2.jpg") - if s == 16: - cv2.destroyAllWindows() - sys.exit(0) - except ValueError: - print("Неверный пункт меню!!!! Выберите другое!") + except Exception: + traceback.print_exc() if __name__ == "__main__": diff --git a/lab2_1/test.jpg b/lab2_1/test.jpg new file mode 100644 index 0000000..fcdc6cc Binary files /dev/null and b/lab2_1/test.jpg differ diff --git a/lab2_2/lab2_2.py b/lab2_2/lab2_2.py index 4326d71..6ade2e2 100644 --- a/lab2_2/lab2_2.py +++ b/lab2_2/lab2_2.py @@ -1,13 +1,17 @@ import sys import cv2 -import numpy +import numpy from PyQt5.QtGui import QImage, QPixmap -from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QVBoxLayout, QHBoxLayout, QPushButton, QFileDialog,QComboBox,QMessageBox +from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QVBoxLayout, QHBoxLayout, QPushButton, QFileDialog, \ + QComboBox, QMessageBox from PyQt5.QtCore import Qt from matplotlib import pyplot as plt + + class Example(QWidget): def __init__(self): super().__init__() + self.image2 = None self.image = None self.label = QLabel() self.initUI() @@ -22,11 +26,10 @@ class Example(QWidget): btn_procesar = QPushButton('Сохранить изображение') btn_procesar.clicked.connect(self.saveImage) - - f=open("Operate.txt","r") - attr=f.read().splitlines() + f = open("Operate.txt", "r") + attr = f.read().splitlines() f.close() - self.oper=QComboBox() + self.oper = QComboBox() self.oper.addItems(attr) self.oper.currentIndexChanged.connect(self.combobox) @@ -43,25 +46,21 @@ class Example(QWidget): self.show() def openImage(self): - self.filename, _ = QFileDialog.getOpenFileName(None, 'Buscar Imagen', '.', 'Image Files (*.png *.jpg *.jpeg *.bmp)') + self.filename, _ = QFileDialog.getOpenFileName(None, 'Buscar Imagen', '.', + 'Image Files (*.png *.jpg *.jpeg *.bmp)') if self.filename: with open(self.filename, "rb") as file: data = numpy.array(bytearray(file.read())) - self.image = cv2.imdecode(data, cv2.IMREAD_UNCHANGED) + self.image = cv2.imdecode(data, cv2.IMREAD_UNCHANGED) self.mostrarImagen(self.image) - self.image2=self.image - - - + self.image2 = self.image def saveImage(self): - filename = QFileDialog.getSaveFileName(self,"QFileDialog.getSaveFileName()","","Image Files (*.jpg)") - img=self.image2 - cv2.imwrite(filename[0],img) - + filename = QFileDialog.getSaveFileName(self, "QFileDialog.getSaveFileName()", "", "Image Files (*.jpg)") + img = self.image2 + cv2.imwrite(filename[0], img) - - def mostrarImagen(self,s): + def mostrarImagen(self, s): size = s.shape step = s.size / size[0] qformat = QImage.Format_Indexed8 @@ -74,198 +73,193 @@ class Example(QWidget): img = img.rgbSwapped() self.label.setPixmap(QPixmap.fromImage(img)) self.resize(self.label.pixmap().size()) - - def combobox(self, index): - if index==0: + def combobox(self, index): + if index == 0: self.i0() - if index==1: + if index == 1: self.i1() - if index==2: + if index == 2: self.i2() - if index==3: + if index == 3: self.i3() - if index==4: + if index == 4: self.i4() - if index==5: + if index == 5: self.i5() - if index==6: + if index == 6: self.i6() - if index==7: + if index == 7: self.i7() - if index==8: + if index == 8: self.i8() - if index==9: + if index == 9: self.i9() - if index==10: + if index == 10: self.i10() - if index==11: + if index == 11: self.i11() - if index==12: + if index == 12: self.i12() - if index==13: + if index == 13: self.i13() - if index==14: + if index == 14: self.i14() - if index==15: + if index == 15: self.i15() - if index==16: + if index == 16: self.i16() - if index==17: + if index == 17: self.i17() - if index==18: + if index == 18: self.i18() - if index==19: + if index == 19: self.i19() - if index==20: + if index == 20: self.i20() - def i0(self): - self.image2=self.image + self.image2 = self.image self.mostrarImagen(self.image) def i1(self): - self.image2=self.image - kernel = numpy.array([[-0.1,0.2,-0.1],[0.2,3.0,0.2],[-0.1,0.2,-0.1]]) - self.image2=cv2.filter2D(self.image2,-1,kernel) + self.image2 = self.image + kernel = numpy.array([[-0.1, 0.2, -0.1], [0.2, 3.0, 0.2], [-0.1, 0.2, -0.1]]) + self.image2 = cv2.filter2D(self.image2, -1, kernel) self.mostrarImagen(self.image2) - - + def i2(self): - self.image2=self.image - self.image2 = cv2.blur(self.image2,(5,5)) + self.image2 = self.image + self.image2 = cv2.blur(self.image2, (5, 5)) self.mostrarImagen(self.image2) - def i3(self): - self.image2=self.image - self.image2 = cv2.medianBlur(self.image2,5) + self.image2 = self.image + self.image2 = cv2.medianBlur(self.image2, 5) self.mostrarImagen(self.image2) - + def i4(self): - self.image2=self.image - self.image2 = cv2.GaussianBlur(self.image2, (9,9),cv2.BORDER_DEFAULT) + self.image2 = self.image + self.image2 = cv2.GaussianBlur(self.image2, (9, 9), cv2.BORDER_DEFAULT) self.mostrarImagen(self.image2) - + def i5(self): - self.image2=self.image + self.image2 = self.image self.image2 = cv2.erode(self.image2, numpy.ones((11, 11))) self.mostrarImagen(self.image2) - + def i6(self): - self.image2=self.image + self.image2 = self.image self.image2 = cv2.dilate(self.image2, numpy.ones((11, 11))) self.mostrarImagen(self.image2) - + def i7(self): - self.image2=self.image - kernel = numpy.ones((6,6),numpy.uint8) - self.image2=cv2.morphologyEx(self.image2, cv2.MORPH_OPEN, kernel,iterations = 1) + self.image2 = self.image + kernel = numpy.ones((6, 6), numpy.uint8) + self.image2 = cv2.morphologyEx(self.image2, cv2.MORPH_OPEN, kernel, iterations=1) self.mostrarImagen(self.image2) - + def i8(self): - self.image2=self.image - kernel = numpy.ones((6,6),numpy.uint8) - self.image2=cv2.morphologyEx(self.image2, cv2.MORPH_CLOSE, kernel,iterations = 1) + self.image2 = self.image + kernel = numpy.ones((6, 6), numpy.uint8) + self.image2 = cv2.morphologyEx(self.image2, cv2.MORPH_CLOSE, kernel, iterations=1) self.mostrarImagen(self.image2) - + def i9(self): - self.image2=self.image - kernel = numpy.ones((6,6),numpy.uint8) - self.image2=cv2.morphologyEx(self.image2, cv2.MORPH_GRADIENT, kernel,iterations = 1) + self.image2 = self.image + kernel = numpy.ones((6, 6), numpy.uint8) + self.image2 = cv2.morphologyEx(self.image2, cv2.MORPH_GRADIENT, kernel, iterations=1) self.mostrarImagen(self.image2) - + def i10(self): - self.image2=self.image - kernel = numpy.ones((6,6),numpy.uint8) - self.image2=cv2.morphologyEx(self.image2, cv2.MORPH_TOPHAT, kernel,iterations = 1) + self.image2 = self.image + kernel = numpy.ones((6, 6), numpy.uint8) + self.image2 = cv2.morphologyEx(self.image2, cv2.MORPH_TOPHAT, kernel, iterations=1) self.mostrarImagen(self.image2) - + def i11(self): - self.image2=self.image - kernel = numpy.ones((6,6),numpy.uint8) - self.image2=cv2.morphologyEx(self.image2, cv2.MORPH_BLACKHAT, kernel,iterations = 1) + self.image2 = self.image + kernel = numpy.ones((6, 6), numpy.uint8) + self.image2 = cv2.morphologyEx(self.image2, cv2.MORPH_BLACKHAT, kernel, iterations=1) self.mostrarImagen(self.image2) - def i12(self): - self.image2=self.image - self.image2 = cv2.cvtColor(self.image2,cv2.COLOR_BGR2GRAY) - self.image2 = cv2.GaussianBlur(self.image2,(3,3),0) - self.image2 = cv2.Sobel(self.image2,cv2.CV_64F,1,0,ksize=5) + self.image2 = self.image + self.image2 = cv2.cvtColor(self.image2, cv2.COLOR_BGR2GRAY) + self.image2 = cv2.GaussianBlur(self.image2, (3, 3), 0) + self.image2 = cv2.Sobel(self.image2, cv2.CV_64F, 1, 0, ksize=5) self.mostrarImagen(self.image2) - + def i13(self): - self.image2=self.image - self.image2 = cv2.cvtColor(self.image2,cv2.COLOR_BGR2GRAY) - self.image2 = cv2.GaussianBlur(self.image2,(3,3),0) - self.image2 = cv2.Sobel(self.image2,cv2.CV_64F,0,1,ksize=5) + self.image2 = self.image + self.image2 = cv2.cvtColor(self.image2, cv2.COLOR_BGR2GRAY) + self.image2 = cv2.GaussianBlur(self.image2, (3, 3), 0) + self.image2 = cv2.Sobel(self.image2, cv2.CV_64F, 0, 1, ksize=5) self.mostrarImagen(self.image2) - + def i14(self): - self.image2=self.image - self.image2 = cv2.cvtColor(self.image2,cv2.COLOR_BGR2GRAY) - self.image2 = cv2.GaussianBlur(self.image2,(3,3),0) - self.image2 = cv2.Sobel(self.image2,cv2.CV_8UC1,0,1,ksize=5) + self.image2 = self.image + self.image2 = cv2.cvtColor(self.image2, cv2.COLOR_BGR2GRAY) + self.image2 = cv2.GaussianBlur(self.image2, (3, 3), 0) + self.image2 = cv2.Sobel(self.image2, cv2.CV_8UC1, 0, 1, ksize=5) self.mostrarImagen(self.image2) - + def i15(self): - self.image2=self.image - self.image2 = cv2.cvtColor(self.image2,cv2.COLOR_RGB2GRAY) - self.image2 = cv2.GaussianBlur(self.image2,(3,3),0) - self.image2 = cv2.Laplacian(self.image2,cv2.CV_64F) + self.image2 = self.image + self.image2 = cv2.cvtColor(self.image2, cv2.COLOR_RGB2GRAY) + self.image2 = cv2.GaussianBlur(self.image2, (3, 3), 0) + self.image2 = cv2.Laplacian(self.image2, cv2.CV_64F) self.mostrarImagen(self.image2) - + def i16(self): - self.image2=self.image - self.image2 = cv2.cvtColor(self.image2,cv2.COLOR_RGB2GRAY) - self.image2 = cv2.blur(self.image2,(5,5)) + self.image2 = self.image + self.image2 = cv2.cvtColor(self.image2, cv2.COLOR_RGB2GRAY) + self.image2 = cv2.blur(self.image2, (5, 5)) self.image2 = cv2.Canny(self.image2, 100, 100) self.mostrarImagen(self.image2) def i17(self): - self.image2=self.image - color = ('b','g','r') - for i,col in enumerate(color): - histr = cv2.calcHist([self.image2],[i],None,[256],[0,256]) - plt.plot(histr,color = col) - plt.xlim([0,256]) + self.image2 = self.image + color = ('b', 'g', 'r') + for i, col in enumerate(color): + histr = cv2.calcHist([self.image2], [i], None, [256], [0, 256]) + plt.plot(histr, color=col) + plt.xlim([0, 256]) plt.show() - def i18(self): - self.image2=self.image - self.image2 = cv2.cvtColor(self.image2,cv2.COLOR_RGB2GRAY) + self.image2 = self.image + self.image2 = cv2.cvtColor(self.image2, cv2.COLOR_RGB2GRAY) self.image2 = cv2.equalizeHist(self.image2) self.mostrarImagen(self.image2) def i19(self): - - self.image2=self.image - self.image2 = cv2.line(self.image2,(15,15),(270,270),(76,187,23),10)#линия - self.image2 = cv2.rectangle(self.image2,(20,20),(100,100),(0,0,255),10)#нарисуем четырехугольник - self.image2 = cv2.circle(self.image2,(100,100),40,(0,255,0),10)#нарисуем круг - self.image=self.image2 + + self.image2 = self.image + self.image2 = cv2.line(self.image2, (15, 15), (270, 270), (76, 187, 23), 10) # линия + self.image2 = cv2.rectangle(self.image2, (20, 20), (100, 100), (0, 0, 255), 10) # нарисуем четырехугольник + self.image2 = cv2.circle(self.image2, (100, 100), 40, (0, 255, 0), 10) # нарисуем круг + self.image = self.image2 self.mostrarImagen(self.image2) def i20(self): if self.filename: with open(self.filename, "rb") as file: data = numpy.array(bytearray(file.read())) - self.image = cv2.imdecode(data, cv2.IMREAD_UNCHANGED) + self.image = cv2.imdecode(data, cv2.IMREAD_UNCHANGED) self.mostrarImagen(self.image) self.mostrarImagen(self.image) - self.image2=self.image + self.image2 = self.image def closeEvent(self, event): - close = QMessageBox.question(self,"Выход","Вы хотите завершить работу?",QMessageBox.Yes | QMessageBox.No) + close = QMessageBox.question(self, "Выход", "Вы хотите завершить работу?", QMessageBox.Yes | QMessageBox.No) if close == QMessageBox.Yes: event.accept() else: event.ignore() + if __name__ == '__main__': app = QApplication(sys.argv) win = Example() - sys.exit(app.exec_()) \ No newline at end of file + sys.exit(app.exec_()) diff --git a/lab4/lab4.py b/lab4/lab4.py index 4131c40..6c92bd1 100644 --- a/lab4/lab4.py +++ b/lab4/lab4.py @@ -1,32 +1,22 @@ -#import numpy as np -#import cv2 -#img = cv2.imread("D:\MACH\LAB_4\crocodile\image_0001.jpg") -#gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) -#sift = cv2.SIFT_create() -#kp = sift.detect(gray,None) -#img=cv2.drawKeypoints(gray,kp,img) -#cv2.imshow("R",img) -#cv2.waitKey(0) -#cv2.destroyAllWindows() +import random import sys import cv2 import numpy as np import random import math +from PyQt5.QtCore import Qt from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtWidgets import (QWidget, QApplication, QLabel, QVBoxLayout, QHBoxLayout, QPushButton, QFileDialog,QComboBox,QMessageBox,QTextBrowser) -from PyQt5.QtCore import Qt + + class Example(QWidget): def __init__(self): super().__init__() self.image = None self.textbrowser = QTextBrowser() - self.initUI() - - def initUI(self): self.btn_open = QPushButton('Изображения folder1') self.btn_open.clicked.connect(self.openImages1) @@ -34,11 +24,9 @@ class Example(QWidget): self.btn_open1 = QPushButton('Изображения folder2') self.btn_open1.clicked.connect(self.openImages2) - self.btn_ = QPushButton('Обучить и создать матрицы') self.btn_.clicked.connect(self.matrix_and_train) - self.btn1 = QPushButton('Детектировать тестовые изображения') self.btn1.clicked.connect(self.detect_image) @@ -49,7 +37,6 @@ class Example(QWidget): self.btn1.setVisible(False) self.btn2.setVisible(False) - top_bar = QHBoxLayout() top_bar.addWidget(self.btn_open) top_bar.addWidget(self.btn_open1) @@ -59,156 +46,159 @@ class Example(QWidget): root = QVBoxLayout(self) root.addLayout(top_bar) root.addWidget(self.textbrowser) - - self.spisok=list() - self.spisok2=list() - self.spisok3=list() + self.spisok = list() + self.spisok2 = list() + self.spisok3 = list() - self.train=list() - self.matrix=list() + self.train = list() + self.matrix = list() self.resize(540, 574) self.setWindowTitle('ST_4') self.show() def openImages1(self): - filenames1 = QFileDialog.getOpenFileNames(None, 'Открыть изображения', '.', 'Image Files (*.png *.jpg *.jpeg *.bmp)') - lk=filenames1[0] - self.erroropened(lk,"1") - self.mass(lk,1) + filenames1 = QFileDialog.getOpenFileNames(None, 'Открыть изображения', '.', + 'Image Files (*.png *.jpg *.jpeg *.bmp)') + lk = filenames1[0] + self.erroropened(lk, "1") + self.mass(lk, 1) lk.clear() - def openImages2(self): - filenames2 = QFileDialog.getOpenFileNames(None, 'Открыть изображения', '.', 'Image Files (*.png *.jpg *.jpeg *.bmp)') - lk=filenames2[0] - self.erroropened(lk,"2") - self.mass(lk,2) + filenames2 = QFileDialog.getOpenFileNames(None, 'Открыть изображения', '.', + 'Image Files (*.png *.jpg *.jpeg *.bmp)') + lk = filenames2[0] + self.erroropened(lk, "2") + self.mass(lk, 2) lk.clear() - - def erroropened(self,s,s1): - if len(s)!=0: - q=QMessageBox.information(self,"Информация","Изображения из "+s1+" папки получены!") + + def erroropened(self, s, s1): + if len(s) != 0: + q = QMessageBox.information(self, "Информация", "Изображения из " + s1 + " папки получены!") else: - q=QMessageBox.information(self,"Информация","Вы не выбрали изображения!") + q = QMessageBox.information(self, "Информация", "Вы не выбрали изображения!") - - def mass(self,p,s1): - if s1==1: + def mass(self, p, s1): + if s1 == 1: self.spisok3.clear() for v in range(len(p)): self.spisok.append(str(p[v])) - self.spisok3.append(str(p[v])+"SKT") - self.appendos("Тестовый набор картинок",self.spisok) - if s1==2: + self.spisok3.append(str(p[v]) + "SKT") + self.appendos("Тестовый набор картинок", self.spisok) + if s1 == 2: for v in range(len(p)): self.spisok2.append(str(p[v])) - self.spisok3.append(str(p[v])+"NO") - self.spisok3=list(set(self.spisok3)) - self.appendos("Набор картинок для тренировки",self.spisok2) + self.spisok3.append(str(p[v]) + "NO") + self.spisok3 = list(set(self.spisok3)) + self.appendos("Набор картинок для тренировки", self.spisok2) self.btn_open.setVisible(False) self.btn_open1.setVisible(False) self.btn_.setVisible(True) - q=QMessageBox.information(self,"Информация","Количество изображений тестовой категории: "+str(len(self.spisok))+"\nКоличество изображений основной категории: "+str(len(self.spisok2))+"\nОбщее количество изображений: "+str(int(len(self.spisok)+int(len(self.spisok2))))) - + q = QMessageBox.information(self, "Информация", "Количество изображений тестовой категории: " + str( + len(self.spisok)) + "\nКоличество изображений основной категории: " + str( + len(self.spisok2)) + "\nОбщее количество изображений: " + str( + int(len(self.spisok) + int(len(self.spisok2))))) + def matrix_and_train(self): for v in range(len(self.spisok3)): - s=str(self.spisok3[v]) + s = str(self.spisok3[v]) if s.endswith("SKT"): - self.train.append(round(float(0.5),1)) - self.matrix.append(round(float(1.0),1)) + self.train.append(round(float(0.5), 1)) + self.matrix.append(round(float(1.0), 1)) if s.endswith("NO"): - q=round(float(random.uniform(1.0,3.0)),1) + q = round(float(random.uniform(1.0, 3.0)), 1) self.train.append(q) - self.matrix.append(round(float(-1.0),1)) - - self.appendos("Ваши тренировочные данные",self.train) - self.appendos("Ваша матрица",self.matrix) - train=np.array([self.train],dtype=int) - labels = np.array(self.matrix,dtype=int) + self.matrix.append(round(float(-1.0), 1)) + + self.appendos("Ваши тренировочные данные", self.train) + self.appendos("Ваша матрица", self.matrix) + train = np.array([self.train], dtype=int) + labels = np.array(self.matrix, dtype=int) self.svm = cv2.ml.SVM_create() self.svm.train(train, cv2.ml.COL_SAMPLE, labels) self.svm.save("1.yml") self.textbrowser.append("Модель сохранена!") - close = QMessageBox.question(self,"Поздравляем!","Ваша модель натренирована!",QMessageBox.Yes | QMessageBox.No) + close = QMessageBox.question(self, "Поздравляем!", "Ваша модель натренирована!", + QMessageBox.Yes | QMessageBox.No) if close == QMessageBox.Yes: pass self.btn_.setVisible(False) self.btn1.setVisible(True) - def appendos(self,s1,s2): + def appendos(self, s1, s2): self.textbrowser.append(s1) for v in range(len(s2)): self.textbrowser.append(str(s2[v])) def detect_image(self): - self.model = RandomForestClassifier(n_estimators=100,bootstrap = True,max_features = 'sqrt') + self.model = RandomForestClassifier(n_estimators=100, bootstrap=True, max_features='sqrt') self.spisok3.clear() for v in range(len(self.spisok)): - lkst=list() + lkst = list() img = cv2.imread(str(self.spisok[v])) - gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) + gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) sift = cv2.SIFT_create() - kp = sift.detect(gray,None) + kp = sift.detect(gray, None) for keyPoint in kp: - #self.spisok3.append(keyPoint.pt[0]) - #self.spisok3.append(keyPoint.pt[1]) - #print(keyPoint.pt[0]) - #print(keyPoint.pt[1]) + # self.spisok3.append(keyPoint.pt[0]) + # self.spisok3.append(keyPoint.pt[1]) + # print(keyPoint.pt[0]) + # print(keyPoint.pt[1]) lkst.append(keyPoint.pt[0]) lkst.append(keyPoint.pt[1]) - - #self.spisok3.append(lkst) - train=np.array([lkst],dtype=int) - labels = np.array([lkst],dtype=int) + + # self.spisok3.append(lkst) + train = np.array([lkst], dtype=int) + labels = np.array([lkst], dtype=int) self.model.fit(train, labels) - self.textbrowser.append("Модель натренирована на рисунке "+str(v)) - #print(len(self.spisok3)) + self.textbrowser.append("Модель натренирована на рисунке " + str(v)) + # print(len(self.spisok3)) self.textbrowser.append("Выявлены контурные точки на тестовых изображениях!") - - #s = keyPoint.size - #print(x,y,s) + + # s = keyPoint.size + # print(x,y,s) self.btn1.setVisible(False) self.btn2.setVisible(True) def form_les_and_train(self): - - #print(self.spisok3) + + # print(self.spisok3) for v in range(len(self.spisok2)): - lk=list() + lkst = list() img = cv2.imread(str(self.spisok2[v])) - gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) + gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) sift = cv2.SIFT_create() - kp = sift.detect(gray,None) + kp = sift.detect(gray, None) for keyPoint in kp: - #self.spisok3.append(keyPoint.pt[0]) - #self.spisok3.append(keyPoint.pt[1]) - #print(keyPoint.pt[0]) - #print(keyPoint.pt[1]) + # self.spisok3.append(keyPoint.pt[0]) + # self.spisok3.append(keyPoint.pt[1]) + # print(keyPoint.pt[0]) + # print(keyPoint.pt[1]) lkst.append(keyPoint.pt[0]) lkst.append(keyPoint.pt[1]) - train =np.array([lkst],dtype=int) + train = np.array([lkst], dtype=int) self.model.predict(train) - #self.model. + # self.model. print("RED") - #train = np.array([self.spisok3],dtype=int) - #labels = np.array([self.spisok3],dtype=int) - #model = RandomForestClassifier(n_estimators=100,bootstrap = True,max_features = 'sqrt') - #model.fit(train, labels) - #tree = DecisionTreeClassifier() - #tree.fit(self.spisok3, self.spisok3) - #accuracy = accuracy_score(len(self.spisok3), len(self.spisok3)) - #print('Model Accuracy:',accuracy) - + # train = np.array([self.spisok3],dtype=int) + # labels = np.array([self.spisok3],dtype=int) + # model = RandomForestClassifier(n_estimators=100,bootstrap = True,max_features = 'sqrt') + # model.fit(train, labels) + # tree = DecisionTreeClassifier() + # tree.fit(self.spisok3, self.spisok3) + # accuracy = accuracy_score(len(self.spisok3), len(self.spisok3)) + # print('Model Accuracy:',accuracy) def closeEvent(self, event): - close = QMessageBox.question(self,"Выход","Вы хотите завершить работу?",QMessageBox.Yes | QMessageBox.No) + close = QMessageBox.question(self, "Выход", "Вы хотите завершить работу?", QMessageBox.Yes | QMessageBox.No) if close == QMessageBox.Yes: event.accept() else: event.ignore() + if __name__ == '__main__': app = QApplication(sys.argv) win = Example() - sys.exit(app.exec_()) \ No newline at end of file + sys.exit(app.exec_())