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.

456 lines
17 KiB

import os
import sys
import cv2
from PyQt5.QtGui import QPixmap, QImage, qRed, qGreen, qBlue
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog, QMessageBox
import matplotlib.pyplot as plt
import numpy as np
import traceback
from PIL import Image
from PyQt5.QtCore import Qt
from predict import solve
def cvImgtoQtImg(cvImg): # 定义opencv图像转PyQt图像的函数
QtImgBuf = cv2.cvtColor(cvImg, cv2.COLOR_BGR2BGRA)
QtImg = QImage(QtImgBuf.data, QtImgBuf.shape[1], QtImgBuf.shape[0], QImage.Format_RGB32)
return QtImg
def QImage2CV(qimg):
tmp = qimg
# 使用numpy创建空的图象
cv_image = np.zeros((tmp.height(), tmp.width(), 3), dtype=np.uint8)
for row in range(0, tmp.height()):
for col in range(0, tmp.width()):
r = qRed(tmp.pixel(col, row))
g = qGreen(tmp.pixel(col, row))
b = qBlue(tmp.pixel(col, row))
cv_image[row, col, 0] = r
cv_image[row, col, 1] = g
cv_image[row, col, 2] = b
cv_image = cv2.cvtColor(cv_image, cv2.COLOR_RGB2BGR)
return cv_image
def QPixmap2cv(qtpixmap):
try:
qimg = qtpixmap.toImage()
temp_shape = (qimg.height(), qimg.bytesPerLine() * 8 // qimg.depth())
temp_shape += (4,)
ptr = qimg.bits()
ptr.setsize(qimg.byteCount())
result = np.array(ptr, dtype=np.uint8).reshape(temp_shape)
result = result[..., :3]
result = cv2.cvtColor(result, cv2.COLOR_RGB2BGR)
except Exception as e:
traceback.print_exc()
return result
def FFT2(img):
# 傅里叶变换
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
res = 20 * np.log(np.abs(fshift))
res = res - res.min()
res = res / res.max() * 255
res = np.array(res, np.uint8)
# plt.imshow(res, cmap='gray')
plt.imshow(res)
plt.axis('off')
plt.savefig('Img.png', bbox_inches='tight', pad_inches=0.0)
plt.close()
result = cv2.imread('Img.png', 0)
os.remove('Img.png')
return result
class MyWindow(QMainWindow):
def __init__(self, Ui_MainWindow):
super().__init__()
self.ui = Ui_MainWindow
app = QApplication(sys.argv)
MainWindow = QMainWindow()
self.ui.setupUi(MainWindow)
self.picpath = ''
self.openfile_name = ''
self.pixmapBefore = QPixmap()
self.pixmapAfter = QPixmap()
self.ui.PicBefore.setScaledContents(False)
self.ui.PicBefore.setAlignment(Qt.AlignCenter)
self.ui.PicAfter.setScaledContents(False)
self.ui.PicAfter.setAlignment(Qt.AlignCenter)
self.ui.ImportBtn.clicked.connect(lambda: self.Import())
self.ui.GrayscaleBtn.clicked.connect(lambda: self.Grayscale())
self.ui.BinarizationBtn.clicked.connect(lambda: self.Binarization())
self.ui.geometryBtn.clicked.connect(lambda: self.Geometry())
self.ui.histogramBtn.clicked.connect(lambda: self.Histogram())
self.ui.EqualizeBtn.clicked.connect(lambda: self.Equalize())
self.ui.MeanBtn.clicked.connect(lambda: self.Mean())
self.ui.BoxBtn.clicked.connect(lambda: self.Box())
self.ui.vagueBtn.clicked.connect(lambda: self.Vague())
self.ui.medianBtn.clicked.connect(lambda: self.Median())
self.ui.RobertsBtn.clicked.connect(lambda: self.Roberts())
self.ui.PrewittBtn.clicked.connect(lambda: self.Prewitt())
self.ui.SobelBtn.clicked.connect(lambda: self.Sobel())
self.ui.LowpassBtn.clicked.connect(lambda: self.Lowpass())
self.ui.HighpassBtn.clicked.connect(lambda: self.Highpass())
self.ui.corrosionBtn.clicked.connect(lambda: self.Corrosion())
self.ui.expansionBtn.clicked.connect(lambda: self.Expansion())
self.ui.OpenBtn.clicked.connect(lambda: self.Open())
self.ui.CloseBtn.clicked.connect(lambda: self.Close())
self.ui.LOGBtn.clicked.connect(lambda: self.LOG())
self.ui.ScharrBtn.clicked.connect(lambda: self.Scharr())
self.ui.CannyBtn.clicked.connect(lambda: self.Canny())
self.ui.SaveBtn.clicked.connect(lambda: self.Save())
self.ui.feiyan.clicked.connect(lambda:self.Feiyan())
MainWindow.show()
sys.exit(app.exec_())
def Import(self):
# 导入图片
self.openfile_name = QFileDialog.getOpenFileName(self, '选择文件', '', "Image Files (*.png *.jpg *.bmp)")[0]
if not self.openfile_name:
# 如果没有选择文件,直接返回
return
try:
self.pixmapBefore = QPixmap(self.openfile_name)
if self.pixmapBefore.isNull():
raise ValueError("无法加载图片文件")
self.picpath = self.openfile_name
image = cv2.imread(self.picpath)
if image is None:
raise ValueError("无法读取图片文件")
self.ui.Label_H.setText(str(image.shape[0]))
self.ui.Label_W.setText(str(image.shape[1]))
self.ui.Label_T.setText(str(image.shape[2]))
self.ui.Label_Type.setText(str(image.dtype))
self.resizeImage(self.ui.PicBefore,self.pixmapBefore)
except Exception as e:
traceback.print_exc()
QMessageBox.critical(self, "错误", f"加载图片文件时出错: {e}")
def Save(self):
if self.pixmapAfter.isNull():
QMessageBox.about(self, '保存失败', '没有已经处理完成的图片')
return
# 保存
SaveName = QFileDialog.getSaveFileName(self, '选择文件', '', "Image Files (*.png *.jpg *.bmp)")[0]
if not SaveName:
return
try:
if type(self.pixmapAfter) == QImage:
print("1")
result = cv2.imwrite(SaveName, QImage2CV(self.pixmapAfter))
else:
print("2")
result = cv2.imwrite(SaveName, QPixmap2cv(self.pixmapAfter))
if result:
QMessageBox.about(self, '保存成功', '保存成功')
else:
QMessageBox.about(self, '保存失败', '路径中不能含有中文和空格')
except Exception as e:
traceback.print_exc()
def resizeImage(self, label, pixmap):
# print("aaa")
if pixmap:
label.setPixmap(pixmap.scaled(label.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))
def resizeEvent(self, event):
self.resizeImage(self.ui.PicBefore,self.pixmapBefore)
self.resizeImage(self.ui.PicAfter,self.pixmapAfter)
super(MyWindow, self).resizeEvent(event)
def check(self):
if self.pixmapBefore.isNull():
QMessageBox.about(self, '操作失败', '请先导入图片')
return True
img = cv2.imread(self.picpath)
if img is None:
QMessageBox.about(self, '操作失败', '无法读取图片')
return True
return False
def Grayscale(self):
if self.check():
return
img = cv2.imread(self.picpath)
grayImg = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
qt_img = cvImgtoQtImg(grayImg)
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter,self.pixmapAfter)
def Binarization(self):
if self.check():
return
try:
img = cv2.imread(self.picpath)
grayImg = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
qt_img = cvImgtoQtImg(cv2.threshold(grayImg, 127, 255, cv2.THRESH_BINARY)[1])
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
except Exception as e:
traceback.print_exc()
def Geometry(self):
if self.check():
return
img = cv2.imread(self.picpath)
self.ui.PicAfter.setScaledContents(False)
qt_img = cvImgtoQtImg(cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def Histogram(self):
if self.check():
return
img = cv2.imread(self.picpath)
img = cv2.calcHist([cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)], [0], None, [256], [0, 255])
plt.plot(img)
plt.savefig('img.jpg')
plt.close()
self.pixmapAfter = QPixmap('img.jpg')
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
os.remove('img.jpg')
def Equalize(self):
if self.check():
return
img = cv2.imread(self.picpath)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
qt_img = cvImgtoQtImg(cv2.equalizeHist(img))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def Mean(self):
if self.check():
return
img = cv2.imread(self.picpath)
qt_img = cvImgtoQtImg(cv2.blur(img, (3, 5)))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def Box(self):
if self.check():
return
img = cv2.imread(self.picpath)
qt_img = cvImgtoQtImg(cv2.boxFilter(img, -1, (3, 5)))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def Vague(self):
if self.check():
return
img = cv2.imread(self.picpath)
qt_img = cvImgtoQtImg(cv2.GaussianBlur(img, (3, 3), 0))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def Median(self):
if self.check():
return
img = cv2.imread(self.picpath)
qt_img = cvImgtoQtImg(cv2.medianBlur(img, 5))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def Roberts(self):
if self.check():
return
img = cv2.imread(self.picpath)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
ret, img_binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
kernelx_Robert = np.array([[-1, 0], [0, 1]], dtype=int)
kernely_Robert = np.array([[0, -1], [1, 0]], dtype=int)
x_Robert = cv2.filter2D(img_binary, cv2.CV_16S, kernelx_Robert)
y_Robert = cv2.filter2D(img_binary, cv2.CV_16S, kernely_Robert)
absX_Robert = cv2.convertScaleAbs(x_Robert)
absY_Robert = cv2.convertScaleAbs(y_Robert)
qt_img = cvImgtoQtImg(cv2.addWeighted(absX_Robert, 0.5, absY_Robert, 0.5, 0))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def Prewitt(self):
if self.check():
return
img = cv2.imread(self.picpath)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
ret, img_binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
kernelx_Prewitt = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)
kernely_Prewitt = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int)
x_Prewitt = cv2.filter2D(img_binary, -1, kernelx_Prewitt)
y_Prewitt = cv2.filter2D(img_binary, -1, kernely_Prewitt)
absX_Prewitt = cv2.convertScaleAbs(x_Prewitt)
absY_Prewitt = cv2.convertScaleAbs(y_Prewitt)
qt_img = cvImgtoQtImg(cv2.addWeighted(absX_Prewitt, 0.5, absY_Prewitt, 0.5, 0))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def Sobel(self):
if self.check():
return
img = cv2.imread(self.picpath)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
ret, img_binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
x_Sobel = cv2.Sobel(img_binary, cv2.CV_16S, 1, 0)
y_Sobel = cv2.Sobel(img_binary, cv2.CV_16S, 0, 1)
absX_Sobel = cv2.convertScaleAbs(x_Sobel)
absY_Sobel = cv2.convertScaleAbs(y_Sobel)
qt_img = cvImgtoQtImg(cv2.addWeighted(absX_Sobel, 0.5, absY_Sobel, 0.5, 0))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def Lowpass(self):
if self.check():
return
img = cv2.imread(self.picpath)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
img_dft = np.fft.fft2(img)
dft_shift_low = np.fft.fftshift(img_dft)
h, w = dft_shift_low.shape[0:2]
h_center, w_center = int(h / 2), int(w / 2)
img_black = np.zeros((h, w), np.uint8)
img_black[h_center - int(100 / 2):h_center + int(100 / 2), w_center - int(100 / 2):w_center + int(100 / 2)] = 1
dft_shift_low = dft_shift_low * img_black
idft_shift = np.fft.ifftshift(dft_shift_low)
ifimg = np.fft.ifft2(idft_shift)
ifimg = np.abs(ifimg)
ifimg = np.int8(ifimg)
cv2.imwrite('img.jpg', ifimg)
self.pixmapAfter = QPixmap('img.jpg')
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
os.remove('img.jpg')
def Highpass(self):
if self.check():
return
img = cv2.imread(self.picpath)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
img_dft = np.fft.fft2(img)
dft_shift = np.fft.fftshift(img_dft)
h, w = dft_shift.shape[0:2]
h_center, w_center = int(h / 2), int(w / 2)
dft_shift[h_center - int(50 / 2):h_center + int(50 / 2),
w_center - int(50 / 2):w_center + int(50 / 2)] = 0
idft_shift = np.fft.ifftshift(dft_shift)
img_idft = np.fft.ifft2(idft_shift)
img_idft = np.abs(img_idft)
img_idft = np.int8(img_idft)
cv2.imwrite('img.jpg', img_idft)
self.pixmapAfter = QPixmap('img.jpg')
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
os.remove('img.jpg')
def Corrosion(self):
if self.check():
return
img = cv2.imread(self.picpath)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
ret, img_binary = cv2.threshold(img, 55, 255, cv2.THRESH_BINARY)
img_binary = np.ones(img_binary.shape, np.uint8) * 255 - img_binary
kernel = np.ones((3, 3), np.uint8)
qt_img = cvImgtoQtImg(cv2.erode(img_binary, kernel))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def Expansion(self):
if self.check():
return
img = cv2.imread(self.picpath)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
ret, img_binary = cv2.threshold(img, 55, 255, cv2.THRESH_BINARY)
img_binary = np.ones(img_binary.shape, np.uint8) * 255 - img_binary
kernel = np.ones((3, 3), np.uint8)
qt_img = cvImgtoQtImg(cv2.dilate(img_binary, kernel, iterations=1))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def Open(self):
if self.check():
return
img = cv2.imread(self.picpath)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
ret, img_binary = cv2.threshold(img, 55, 255, cv2.THRESH_BINARY)
img_binary = np.ones(img_binary.shape, np.uint8) * 255 - img_binary
kernel = np.ones((3, 3), np.uint8)
qt_img = cvImgtoQtImg(cv2.morphologyEx(img_binary, cv2.MORPH_OPEN, kernel))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def Close(self):
if self.check():
return
img = cv2.imread(self.picpath)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
ret, img_binary = cv2.threshold(img, 55, 255, cv2.THRESH_BINARY)
img_binary = np.ones(img_binary.shape, np.uint8) * 255 - img_binary
kernel = np.ones((3, 3), np.uint8)
qt_img = cvImgtoQtImg(cv2.morphologyEx(img_binary, cv2.MORPH_CLOSE, kernel))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def LOG(self):
if self.check():
return
img = cv2.imread(self.picpath)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_blur = cv2.GaussianBlur(img_gray, (3, 3), 1, 1)
LOG_result = cv2.Laplacian(img_blur, cv2.CV_16S, ksize=1)
qt_img = cvImgtoQtImg(cv2.convertScaleAbs(LOG_result))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def Scharr(self):
if self.check():
return
img = cv2.imread(self.picpath)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Scharr_result = cv2.Scharr(img_gray, cv2.CV_16S, dx=1, dy=0)
qt_img = cvImgtoQtImg(cv2.convertScaleAbs(Scharr_result))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def Canny(self):
if self.check():
return
img = cv2.imread(self.picpath)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_blur_canny = cv2.GaussianBlur(img_gray, (7, 7), 1, 1)
qt_img = cvImgtoQtImg(cv2.Canny(img_blur_canny, 50, 150))
self.pixmapAfter = QPixmap.fromImage(qt_img)
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def Feiyan(self):
if self.check():
return
print(self.picpath)
filename = str(self.convert_path(self.picpath))
print(filename)
_ = solve("checkpoint_epoch16.pth",filename,"out.png",num_classes=4)
self.pixmapAfter = QPixmap("out.png")
self.resizeImage(self.ui.PicAfter, self.pixmapAfter)
def convert_path(self,path):
return path.replace("/", "\\")