You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

402 lines
14 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import sys
import warnings
import cv2
import numpy as np
import struct
import matplotlib.pyplot as plt
from PyQt5 import QtWidgets, QtGui
from ColorMenu import ColorMenu
from geometryMenu import geometryMenu
from mophologyMenu import mophologyMenu
from edgeMenu import EdgeMenu
from filterMenu import FilterMenu
from faceDetect import FaceDetect
from ui_file_1 import Ui_mainWindow
from PyQt5.QtWidgets import QMessageBox, QFileDialog, QInputDialog, QLineEdit
from qt_material import apply_stylesheet
class WXTWindow(QtWidgets.QMainWindow, Ui_mainWindow):
def __init__(self):
self.default_save_path = 'img'
super(WXTWindow, self).__init__()
self.setupUi(self)
#QMessageBox.about(self.window(), "使用提示", "欢迎使用~ 在对图像进行操作前,请先选择要处理的图片~")
self.pic_path = "" # 初始化空值
self.menubar.setEnabled(True)
self.color_menu.setEnabled(False)
self.geo_menu.setEnabled(False)
self.histogram_menu.setEnabled(False)
self.mophology_menu.setEnabled(False)
self.advancecd_menu.setEnabled(False)
self.denoising_menu.setEnabled(False)
self.faceMenu.setEnabled(False)
self.Save_btn.setEnabled(False)
# 打开图片
def OpenImg(self):
imgName, imgType = QFileDialog.getOpenFileName(self, "打开图片", "OriginPictures", "*.jpg;;*.bmp;;*.png")
jpg = QtGui.QPixmap(imgName).scaled(self.ori_pic.width(), self.ori_pic.height(), 1 ,1)
self.ori_pic.setPixmap(jpg)
self.origin_pic_path.setText(imgName)
self.pic_path = imgName
self.fixed_pic.setText("")
self.fixed_pic.clear()
if self.pic_path == "":
self.color_menu.setEnabled(False)
self.geo_menu.setEnabled(False)
self.histogram_menu.setEnabled(False)
self.mophology_menu.setEnabled(False)
self.advancecd_menu.setEnabled(False)
self.denoising_menu.setEnabled(False)
self.faceMenu.setEnabled(False)
self.Save_btn.setEnabled(False)
return
#各部分初始化
self.Initialize_color()
self.Initialize_geo()
self.InitializeMopho()
self.InitializeEdge()
self.InitializeFilter()
self.color_menu.setEnabled(True)
self.geo_menu.setEnabled(True)
self.histogram_menu.setEnabled(True)
self.mophology_menu.setEnabled(True)
self.advancecd_menu.setEnabled(True)
self.denoising_menu.setEnabled(True)
self.faceMenu.setEnabled(True)
self.Save_btn.setEnabled(True)
def SaveImg(self):
if self.save_pic_path.text() == "默认保存在img文件夹":
QMessageBox.information(self, "提示", "尚未进行图片操作,不能保存")
return
if self.pic_path != "" :
imgURL = QFileDialog.getExistingDirectory(self, "保存图片", "SavedPictures")
savepic = cv2.imread(self.save_pic_path.text(), 1)
cv2.imwrite(imgURL + '/SavedPic.jpg', savepic)
# 显示保存的图片
def Show_Fixed_Pic(self, path):
jpg = QtGui.QPixmap(path).scaled(self.fixed_pic.width(), self.fixed_pic.height(), 1, 1)
self.fixed_pic.setPixmap(jpg)
self.save_pic_path.setText(path)
# 显示位图信息头
def Show_Pic_Info(self):
pass
#以下为色彩菜单函数
def Initialize_color(self):
self.color = ColorMenu(self.pic_path)
def GreyPic(self):
greypic = cv2.imread(self.pic_path, 0)
cv2.imwrite('img/greyimg.jpg', greypic)
self.Show_Fixed_Pic('img/greyimg.jpg')
def ExtractBchannel(self):
self.color.Bchannel()
self.Show_Fixed_Pic('img/colorImgs/Cchannel.jpg')
def ExtractGchannel(self):
self.color.Gchannel()
self.Show_Fixed_Pic('img/colorImgs/Cchannel.jpg')
def ExtractRchannel(self):
self.color.Rchannel()
self.Show_Fixed_Pic('img/colorImgs/Cchannel.jpg')
def ExtractHchannel(self):
self.color.Hchannel()
self.Show_Fixed_Pic('img/colorImgs/Cchannel.jpg')
def ExtractSchannel(self):
self.color.Schannel()
self.Show_Fixed_Pic('img/colorImgs/Cchannel.jpg')
def ExtractVchannel(self):
self.color.Vchannel()
self.Show_Fixed_Pic('img/colorImgs/Cchannel.jpg')
#以下为移动菜单函数
def Initialize_geo(self):
self.geoOperation = geometryMenu(self.pic_path)
def MovePic(self):
numx, ok1 = QInputDialog.getInt(self, 'X轴移动值', '请输入向右移动的值', 0, -10000, 10000, 10)
numy, ok2 = QInputDialog.getInt(self, 'Y轴移动值', '请输入向下移动的值', 0, -10000, 10000, 10)
if ok1 and ok2:
#if numx != 0 or numy != 0:
self.geoOperation.ImageMove(numx, numy)
self.Show_Fixed_Pic('img/geometryImgs/moved_pic.jpg')
def ImageResizeTimes(self):
numx, ok1 = QInputDialog.getDouble(self, '横向放缩值', '请输入横向放缩值', 1, 0.01, 5, 1)
numy, ok2 = QInputDialog.getDouble(self, '纵向放缩值', '请输入纵向放缩值', 1, 0.01, 5, 1)
if ok1 and ok2:
if numx != 1 or numy != 1:
self.geoOperation.ImageResizeTimes(numx, numy)
self.Show_Fixed_Pic('img/geometryImgs/moved_pic.jpg')
def ImageResizePixel(self):
numx, ok1 = QInputDialog.getInt(self, '横向像素值', '请输入横向像素值', 8, 8, 20000, 1)
numy, ok2 = QInputDialog.getInt(self, '纵向像素值', '请输入纵向像素值', 8, 8, 20000, 1)
if ok1 and ok2:
self.geoOperation.ImageResizePixel(numx, numy)
self.Show_Fixed_Pic('img/geometryImgs/moved_pic.jpg')
def HorizontalFlip(self):
self.geoOperation.HorizentalFlip()
self.Show_Fixed_Pic('img/geometryImgs/moved_pic.jpg')
def VerticalFlip(self):
self.geoOperation.VerticalFlip()
self.Show_Fixed_Pic('img/geometryImgs/moved_pic.jpg')
def CrossFlip(self):
self.geoOperation.CrossFlip()
self.Show_Fixed_Pic('img/geometryImgs/moved_pic.jpg')
def FreeRotate(self):
angle, ok1 = QInputDialog.getInt(self, '角度', '请输入顺时针旋转角度', 0, -360, 360, 1)
size, ok2 = QInputDialog.getDouble(self, '放缩值', '请输入放缩值,默认为1无需更改', 1, 0.01, 5, 1)
if ok1 and ok2:
self.geoOperation.FreeRotate(angle, size)
self.Show_Fixed_Pic('img/geometryImgs/moved_pic.jpg')
def FixedRotate(self):
items = ('90', '180', '270')
angle, ok = QInputDialog.getItem(self, '角度', '请输入顺时针旋转角度', items, 0, False)
if ok:
self.geoOperation.FixedRotate(angle)
self.Show_Fixed_Pic('img/geometryImgs/moved_pic.jpg')
#以下为直方图函数
def DrawGreyHistogram(self):
greypic = cv2.imread(self.pic_path, 0)
hist = cv2.calcHist([greypic], [0], None, [256], [0, 256])
plt.plot(hist)
plt.xlim([0, 255])
plt.savefig('img/histogram/histogram.jpg')
plt.close()
self.Show_Fixed_Pic('img/histogram/histogram.jpg')
def DrawRGBHistogram(self):
pic = cv2.imread(self.pic_path, 1)
color = ('r', 'g', 'b')
for i, col in enumerate(color):
hist = cv2.calcHist([pic], [i], None, [256], [0, 256])
plt.plot(hist)
plt.xlim([0, 256])
plt.savefig('img/histogram/histogram.jpg')
plt.close()
self.Show_Fixed_Pic('img/histogram/histogram.jpg')
#以下为形态学运算函数
def InitializeMopho(self):
self.mophology = mophologyMenu(self.pic_path)
def Erode(self):
size, ok = QInputDialog.getInt(self, '腐蚀结构元大小', '请输入默认为5', 5, 1, 1000, 1)
if ok:
self.mophology.Erode(size)
self.Show_Fixed_Pic('img/mophologyImgs/mophoPic.jpg')
def Dilate(self):
size, ok = QInputDialog.getInt(self, '膨胀结构元大小', '请输入默认为5', 5, 1, 1000, 1)
if ok:
self.mophology.Dilate(size)
self.Show_Fixed_Pic('img/mophologyImgs/mophoPic.jpg')
def OpenOperate(self):
size, ok = QInputDialog.getInt(self, '开运算结构元大小', '请输入默认为5', 5, 1, 1000, 1)
if ok:
self.mophology.Open(size)
self.Show_Fixed_Pic('img/mophologyImgs/mophoPic.jpg')
def CloseOperate(self):
size, ok = QInputDialog.getInt(self, '闭运算结构元大小', '请输入默认为5', 5, 1, 1000, 1)
if ok:
self.mophology.Close(size)
self.Show_Fixed_Pic('img/mophologyImgs/mophoPic.jpg')
#以下为图像增强以及边缘检测、锐化函数
def InitializeEdge(self):
self.edgeOpe = EdgeMenu(self.pic_path)
def PicStrength(self):
self.edgeOpe.PicStrength()
self.Show_Fixed_Pic('img/EdgeImgs/EdgePic.jpg')
def RobertsOperation(self):
self.edgeOpe.EdgeRoberts()
self.Show_Fixed_Pic('img/EdgeImgs/EdgePic.jpg')
def SobelOperation(self):
self.edgeOpe.EdgeSobel()
self.Show_Fixed_Pic('img/EdgeImgs/EdgePic.jpg')
def LaplacianOperation(self):
items = ('1', '3', '5', '7')
size, ok = QInputDialog.getItem(self, 'Laplacian算子大小', '请输入默认为1', items, 0, False)
if ok:
self.edgeOpe.EdgeLaplacian(size)
self.Show_Fixed_Pic('img/EdgeImgs/EdgePic.jpg')
def LoGOperation(self):
QMessageBox.information(self, "提示", "LoG算子运算较慢请耐心等待")
self.edgeOpe.EdgeLoG()
self.Show_Fixed_Pic('img/EdgeImgs/EdgePic.jpg')
def CannyOperation(self):
self.edgeOpe.EdgeCanny()
self.Show_Fixed_Pic('img/EdgeImgs/EdgePic.jpg')
def HoughStraight(self):
colors = ['red', 'green', 'blue', 'black', 'white']
color, ok1 = QInputDialog.getItem(self, '线条颜色', '请输入,默认为红', colors, 0, False)
thres, ok2 = QInputDialog.getInt(self, '阈值', '请输入阈值阈值越大检测出的线段越长越少默认为100', 100, 1, 1000, 1)
if ok1 and ok2:
self.edgeOpe.HoughDetect(thres, color)
self.Show_Fixed_Pic('img/EdgeImgs/EdgePic.jpg')
def HoughCurve(self):
colors = ['red', 'green', 'blue', 'black', 'white']
color, ok1 = QInputDialog.getItem(self, '线条颜色', '请输入,默认为红', colors, 0, False)
thres, ok2 = QInputDialog.getInt(self, '阈值', '请输入阈值阈值越大检测出的线段越长越少默认为100', 100, 1, 1000, 1)
minline, ok3 = QInputDialog.getInt(self, '线段最小长度', '请输入线段最小长度默认为0', 0, 0, 1000, 1)
maxgap, ok4 = QInputDialog.getInt(self, '线段间最大允许间隔', '请输入间隔默认为0', 0, 0, 1000, 1)
if ok1 and ok2 and ok3 and ok4:
self.edgeOpe.HoughDetectP(thres, minline, maxgap, color)
self.Show_Fixed_Pic('img/EdgeImgs/EdgePic.jpg')
#以下为去噪相关部分槽函数
def InitializeFilter(self):
self.filterOpe = FilterMenu(self.pic_path)
def GaussNoise(self):
avg, ok1 = QInputDialog.getDouble(self, '均值', '请输入均值', 0, 0, 100)
var, ok2 = QInputDialog.getDouble(self, '方差', '请输入方差', 0.5, 0, 100)
if ok1 and ok2:
self.filterOpe.GaussNoise(avg,var)
self.Show_Fixed_Pic('img/filterImgs/FilterPic.jpg')
def PepperSaltyNoise(self):
thres, ok1 = QInputDialog.getDouble(self, '噪声阈值', '请输入阈值', 0.2, 0.01, 0.99)
if ok1:
self.filterOpe.PepperSaltyNoise(thres)
self.Show_Fixed_Pic('img/filterImgs/FilterPic.jpg')
def GaussFilter(self):
sizes, ok = QInputDialog.getInt(self, '高斯核大小', '请输入,必须为奇数,默认为1', 1, 1, 15)
if ok:
if sizes % 2 == 1:
self.filterOpe.gaussFilter(sizes)
self.Show_Fixed_Pic('img/filterImgs/FilterPic.jpg')
else:
QMessageBox.information(self, "提示", "输入的核大小必须为奇数")
def AvgFilter(self):
self.filterOpe.AverageFilter()
self.Show_Fixed_Pic('img/filterImgs/FilterPic.jpg')
def MidFilter(self):
self.filterOpe.middleFilter()
self.Show_Fixed_Pic('img/filterImgs/FilterPic.jpg')
def minFilter(self):
self.filterOpe.LeastFilter()
self.Show_Fixed_Pic('img/filterImgs/FilterPic.jpg')
def maxFilter(self):
self.filterOpe.LargestFilter()
self.Show_Fixed_Pic('img/filterImgs/FilterPic.jpg')
def PassFilter(self):
items = ('0', '255')
min, ok1 = QInputDialog.getInt(self, '带通范围', '请输入最低范围,至少0', 20, 0, 255)
max, ok2 = QInputDialog.getInt(self, '带通范围', '请输入最高范围,至多255', 220, 0, 255)
num, ok3 = QInputDialog.getItem(self, '非滤指定值', '请选择', items, 0, False)
if ok1 and ok2 and ok3:
self.filterOpe.PassFilter(min, max, num)
self.Show_Fixed_Pic('img/filterImgs/FilterPic.jpg')
def BlockFilter(self):
items = ('0', '255')
min, ok1 = QInputDialog.getInt(self, '带阻范围', '请输入最低范围,至少0', 20, 0, 255)
max, ok2 = QInputDialog.getInt(self, '带阻范围', '请输入最高范围,至多255', 220, 0, 255)
num, ok3 = QInputDialog.getItem(self, '非滤指定值', '请选择', items, 0, False)
if ok1 and ok2 and ok3:
self.filterOpe.BlockFilter(min, max, num)
self.Show_Fixed_Pic('img/filterImgs/FilterPic.jpg')
#以下是人脸识别
def faceDetect(self):
self.facedtct = FaceDetect(self.pic_path)
self.facedtct.detectFace()
self.Show_Fixed_Pic('img/faceImg/facePic.jpg')
def videoDetect(self):
self.facedtct = FaceDetect(self.pic_path)
try:
self.facedtct.videoDetect()
except Exception as e:
QMessageBox.information(self, "提示", "退出了人脸识别")
if __name__ == '__main__':
warnings.filterwarnings('ignore')
app = QtWidgets.QApplication(sys.argv)
myWin = WXTWindow()
apply_stylesheet(app, theme='light_cyan.xml')
myWin.show()
sys.exit(app.exec_())