refactoring

This commit is contained in:
vlad 2022-11-24 10:52:38 +03:00
parent c567ba6273
commit c6e36a2f72
4 changed files with 352 additions and 367 deletions

View File

@ -1,65 +1,51 @@
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 main():
image1 = cv2.imread("D:\\MACH\\LAB_2\\image0.jpg")
image2 = image1.copy()
im = image1.copy()
while True:
menu()
try:
s = int(input())
if s == 1:
image2 = image1.copy()
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]])
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()
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", image1)
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)
@ -76,86 +62,101 @@ def main():
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()
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", image1)
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
cv2.waitKey(0)
if s == 9:
image2 = image1.copy()
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", image1)
cv2.imshow("Result_Image", im3) # x
cv2.waitKey(0)
if s == 10:
image2 = image1.copy()
image3 = cv2.cvtColor(image2, cv2.COLOR_RGB2GRAY)
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", image1)
cv2.imshow("Result_Image", image3) # x
cv2.waitKey(0)
if s == 11:
image2 = image1.copy()
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", image1)
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()
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)
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(SOURCE_IMAGE)
while True:
try:
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)
os.remove("1.jpg")
os.remove("2.jpg")
if s == 16:
cv2.destroyAllWindows()
sys.exit(0)
except ValueError:
print("Неверный пункт меню!!!! Выберите другое!")
except Exception:
print("Произошла ошибка при выполнении функции")
traceback.print_exc()
else:
print("Функция не найдена! введите '?' для получения справки")
except Exception:
traceback.print_exc()
if __name__ == "__main__":

BIN
lab2_1/test.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

View File

@ -2,12 +2,16 @@ import sys
import cv2
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,7 +26,6 @@ class Example(QWidget):
btn_procesar = QPushButton('Сохранить изображение')
btn_procesar.clicked.connect(self.saveImage)
f = open("Operate.txt", "r")
attr = f.read().splitlines()
f.close()
@ -43,7 +46,8 @@ 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()))
@ -51,16 +55,11 @@ class Example(QWidget):
self.mostrarImagen(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)
def mostrarImagen(self, s):
size = s.shape
step = s.size / size[0]
@ -75,7 +74,6 @@ class Example(QWidget):
self.label.setPixmap(QPixmap.fromImage(img))
self.resize(self.label.pixmap().size())
def combobox(self, index):
if index == 0:
self.i0()
@ -120,7 +118,6 @@ class Example(QWidget):
if index == 20:
self.i20()
def i0(self):
self.image2 = self.image
self.mostrarImagen(self.image)
@ -131,13 +128,11 @@ class Example(QWidget):
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.mostrarImagen(self.image2)
def i3(self):
self.image2 = self.image
self.image2 = cv2.medianBlur(self.image2, 5)
@ -188,7 +183,6 @@ class Example(QWidget):
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)
@ -233,7 +227,6 @@ class Example(QWidget):
plt.xlim([0, 256])
plt.show()
def i18(self):
self.image2 = self.image
self.image2 = cv2.cvtColor(self.image2, cv2.COLOR_RGB2GRAY)
@ -265,6 +258,7 @@ class Example(QWidget):
else:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Example()

View File

@ -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)
@ -64,7 +51,6 @@ class Example(QWidget):
self.spisok2 = list()
self.spisok3 = list()
self.train = list()
self.matrix = list()
self.resize(540, 574)
@ -72,15 +58,16 @@ class Example(QWidget):
self.show()
def openImages1(self):
filenames1 = QFileDialog.getOpenFileNames(None, 'Открыть изображения', '.', 'Image Files (*.png *.jpg *.jpeg *.bmp)')
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)')
filenames2 = QFileDialog.getOpenFileNames(None, 'Открыть изображения', '.',
'Image Files (*.png *.jpg *.jpeg *.bmp)')
lk = filenames2[0]
self.erroropened(lk, "2")
self.mass(lk, 2)
@ -92,7 +79,6 @@ class Example(QWidget):
else:
q = QMessageBox.information(self, "Информация", "Вы не выбрали изображения!")
def mass(self, p, s1):
if s1 == 1:
self.spisok3.clear()
@ -109,7 +95,10 @@ class Example(QWidget):
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)):
@ -130,7 +119,8 @@ class Example(QWidget):
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)
@ -175,7 +165,7 @@ class Example(QWidget):
# 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)
sift = cv2.SIFT_create()
@ -200,7 +190,6 @@ class Example(QWidget):
# 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)
if close == QMessageBox.Yes:
@ -208,6 +197,7 @@ class Example(QWidget):
else:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Example()