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.

356 lines
13 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.

from PyQt5 import QtGui
from PyQt5.QtWidgets import *
import cv2
import numpy as np
def init(self):
self.unit4_img = np.ndarray(())
self.unit4_robertsimg = np.ndarray(())
self.unit4_prewittimg = np.ndarray(())
self.unit4_logimg = np.ndarray(())
self.unit4_sobelimg = np.ndarray(())
self.unit4_laplacianimg = np.ndarray(())
self.unit4_loughimg = np.ndarray(())
self.unit4_cannyimg = np.ndarray(())
self.unit4_img_channel = 1
self.unit4_robertsimg_channel = 1
self.unit4_prewittimg_channel = 1
self.unit4_logimg_channel = 1
self.unit4_sobelimg_channel = 1
self.unit4_laplacianimg_channel = 1
self.unit4_loughimg_channel = 1
self.unit4_cannyimg_channel = 1
def img_load(self):
fileName, tmp = QFileDialog.getOpenFileName(self, '打开图像', 'Image', '*.png *.jpg *.bmp *.jpeg')
if fileName == '':
return
init(self)
self.unit4_img = cv2.imread(fileName, -1)
if self.unit4_img.size <= 1:
return
if len(self.unit4_img.shape) == 3:
self.unit4_img_channel = 3
if self.unit4_img.shape[2] == 4:
self.unit4_img = cv2.cvtColor(self.unit4_img, cv2.COLOR_BGRA2BGR)
print(self.unit4_img.shape)
unit4_img_refresh(self)
def unit4_img_refresh(self):
array = \
[self.unit4_img,
self.unit4_robertsimg,
self.unit4_prewittimg,
self.unit4_logimg,
self.unit4_sobelimg,
self.unit4_laplacianimg,
self.unit4_loughimg,
self.unit4_cannyimg]
array2 = [self.ui.label_53,
self.ui.label_43,
self.ui.label_30,
self.ui.label_49,
self.ui.label_58,
self.ui.label_32,
self.ui.label_34,
self.ui.label_50]
channel = [self.unit4_img_channel,
self.unit4_robertsimg_channel,
self.unit4_prewittimg_channel,
self.unit4_logimg_channel,
self.unit4_sobelimg_channel,
self.unit4_laplacianimg_channel,
self.unit4_loughimg_channel,
self.unit4_cannyimg_channel]
height = 240
weight = 240
for index in range(len(array)):
M = np.float32([[1, 0, 0], [0, 1, 0]])
if array[index].size <= 1:
array2[index].setPixmap(QtGui.QPixmap(''))
continue
print(array[index].shape)
index_h = array[index].shape[0]
index_w = array[index].shape[1]
if index_h / index_w == height / weight:
img = array[index].tobytes()
if channel[index] == 1:
image = QtGui.QImage(img, index_w, index_h, index_w * channel[index], QtGui.QImage.Format_Grayscale8)
pix = QtGui.QPixmap.fromImage(image)
scale_pix = pix.scaled(weight, height)
array2[index].setPixmap(scale_pix)
continue
elif channel[index] == 3:
image = QtGui.QImage(img, index_w, index_h, index_w * channel[index], QtGui.QImage.Format_BGR888)
pix = QtGui.QPixmap.fromImage(image)
scale_pix = pix.scaled(weight, height)
array2[index].setPixmap(scale_pix)
continue
elif index_h / index_w > height / weight:
h_ = index_h
w_ = int(index_h * weight / height+ 0.5)
M[0, 2] += (w_ - index_w) / 2
M[1, 2] += (h_ - index_h) / 2
else:
h_ = int(index_w * height / weight + 0.5)
w_ = index_w
M[0, 2] += (w_ - index_w) / 2
M[1, 2] += (h_ - index_h) / 2
img = cv2.warpAffine(array[index], M, (w_, h_))
data = img.tobytes()
if channel[index] == 1:
image = QtGui.QImage(data, w_, h_, w_ * channel[index], QtGui.QImage.Format_Grayscale8)
pix = QtGui.QPixmap.fromImage(image)
scale_pix = pix.scaled(weight, height)
array2[index].setPixmap(scale_pix)
continue
else:
image = QtGui.QImage(data, w_, h_, w_ * channel[index], QtGui.QImage.Format_BGR888)
pix = QtGui.QPixmap.fromImage(image)
scale_pix = pix.scaled(weight, height)
array2[index].setPixmap(scale_pix)
continue
return
def img_clear(self):
if self.unit4_img.size > 1:
init(self)
unit4_img_refresh(self)
else:
msg_box = QMessageBox(QMessageBox.Warning, '无需清空', '没有图片')
msg_box.exec_()
def action(self):
if self.unit4_img.size>1:
#try:
Roberts(self)
print("Roberts over!")
Prewitt(self)
print("Prewitt over!")
Log(self)
print("Log over!")
Sobel(self)
print("Sobel over!")
Laplacian(self)
print("Laplacian over!")
Lough(self)
print("Lough over!")
Canny(self)
print("Canny over!")
unit4_img_refresh(self)
#except:
#msg_box = QMessageBox(QMessageBox.Warning, '算子执行异常', '请更换图片')
#msg_box.exec_()
else:
msg_box = QMessageBox(QMessageBox.Warning, '提示', '请选择图片')
msg_box.exec_()
def Roberts(self):
img = self.unit4_img
if(self.unit4_img_channel == 3):
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Roberts算子
kernelx = np.array([[-1,0],[0,1]],dtype=int)
kernely = np.array([[0,-1],[1,0]],dtype=int)
# 卷积操作
x = cv2.filter2D(img,cv2.CV_16S,kernelx)
y = cv2.filter2D(img,cv2.CV_16S,kernely)
# 数据格式转换
absX=cv2.convertScaleAbs(x)
absY=cv2.convertScaleAbs(y)
self.unit4_robertsimg = cv2.addWeighted(absX,0.5,absY,0.5,0)
def Prewitt(self):
grayImage = self.unit4_img
if (self.unit4_img_channel == 3):
grayImage = cv2.cvtColor(grayImage, cv2.COLOR_BGR2GRAY)
kernelx = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)
kernely = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int)
x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)
y = cv2.filter2D(grayImage, cv2.CV_16S, kernely)
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
self.unit4_prewittimg = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
def Log(self):
img = self.unit4_img
if (self.unit4_img_channel == 3):
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 2边缘扩充处理图像并使用高斯滤波处理该图像
image = cv2.copyMakeBorder(img, 2, 2, 2, 2, borderType=cv2.BORDER_REPLICATE)
image = cv2.GaussianBlur(image, (3, 3), 0, 0)
# 使用Numpy定义LoG算子
m1 = np.array(
[[0, 0, -1, 0, 0], [0, -1, -2, -1, 0], [-1, -2, 16, -2, -1], [0, -1, -2, -1, 0], [0, 0, -1, 0, 0]])
# 卷积运算
rows = image.shape[0]
cols = image.shape[1]
image1 = np.zeros(image.shape)
for i in range(2, rows - 2):
for j in range(2, cols - 2):
image1[i, j] = np.sum((m1 * image[i - 2:i + 3, j - 2:j + 3]))
self.unit4_logimg = cv2.convertScaleAbs(image1)
def Sobel(self):
grayImage = self.unit4_img
if (self.unit4_img_channel == 3):
grayImage = cv2.cvtColor(grayImage, cv2.COLOR_BGR2GRAY)
# 求Sobel 算子
x = cv2.Sobel(grayImage, cv2.CV_16S, 1, 0)
y = cv2.Sobel(grayImage, cv2.CV_16S, 0, 1)
# 数据格式转换
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
self.unit4_sobelimg = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
def Laplacian(self):
grayImage = self.unit4_img
if (self.unit4_img_channel == 3):
grayImage = cv2.cvtColor(grayImage, cv2.COLOR_BGR2GRAY)
# 高斯滤波
grayImage = cv2.GaussianBlur(grayImage,ksize=(5,5),sigmaX=0,sigmaY=0)
# 拉普拉斯算法
dst = cv2.Laplacian(grayImage, cv2.CV_16S, ksize=3)
# 数据格式转换
self.unit4_laplacianimg = cv2.convertScaleAbs(dst)
def Lough(self):
img = self.unit4_img
if (self.unit4_img_channel == 3):
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.GaussianBlur(img, (3, 3), 0)
edges = cv2.Canny(img, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi / 2, 118)
result = img.copy()
for i_line in lines:
for line in i_line:
rho = line[0]
theta = line[1]
if (theta < (np.pi / 4.)) or (theta > (3. * np.pi / 4.0)): # 垂直直线
pt1 = (int(rho / np.cos(theta)), 0)
pt2 = (int((rho - result.shape[0] * np.sin(theta)) / np.cos(theta)), result.shape[0])
cv2.line(result, pt1, pt2, (0, 0, 255))
else:
pt1 = (0, int(rho / np.sin(theta)))
pt2 = (result.shape[1], int((rho - result.shape[1] * np.cos(theta)) / np.sin(theta)))
cv2.line(result, pt1, pt2, (0, 0, 255), 1)
linesP = cv2.HoughLinesP(edges, 1, np.pi / 180, 80, 200, 15)
result_P = img.copy()
for i_P in linesP:
for x1, y1, x2, y2 in i_P:
cv2.line(result_P, (x1, y1), (x2, y2), (0, 255, 0), 3)
self.unit4_loughimg = result_P
def Canny(self):
image = self.unit4_img
if (self.unit4_img_channel == 3):
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 高斯滤波
image= cv2.GaussianBlur(image, (3, 3), 0)
# 求xy方向的Sobel算子
gradx = cv2.Sobel(image, cv2.CV_16SC1, 1, 0)
grady = cv2.Sobel(image, cv2.CV_16SC1, 0, 1)
print("Yes")
# 使用Canny函数处理图像x,y分别是3求出来的梯度低阈值50高阈值150
self.unit4_cannyimg = cv2.Canny(gradx, grady, 50, 150)
def canny_save(self):
if self.unit4_cannyimg.size > 1:
fileName, tmp = QFileDialog.getSaveFileName(self, '保存图像', 'Image', '*.png *.jpg *.bmp *.jpeg')
if fileName == '':
return
cv2.imwrite(fileName, self.unit4_cannyimg)
msg_box = QMessageBox(QMessageBox.Information, '成功', '图像保存成功,保存路径为:' + fileName)
msg_box.exec_()
else:
msg_box = QMessageBox(QMessageBox.Warning, '提示', '没有生成图像')
msg_box.exec_()
def log_save(self):
if self.unit4_logimg.size > 1:
fileName, tmp = QFileDialog.getSaveFileName(self, '保存图像', 'Image', '*.png *.jpg *.bmp *.jpeg')
if fileName == '':
return
cv2.imwrite(fileName, self.unit4_logimg)
msg_box = QMessageBox(QMessageBox.Information, '成功', '图像保存成功,保存路径为:' + fileName)
msg_box.exec_()
else:
msg_box = QMessageBox(QMessageBox.Warning, '提示', '没有生成图像')
msg_box.exec_()
def lough_save(self):
if self.unit4_loughimg.size > 1:
fileName, tmp = QFileDialog.getSaveFileName(self, '保存图像', 'Image', '*.png *.jpg *.bmp *.jpeg')
if fileName == '':
return
cv2.imwrite(fileName, self.unit4_loughimg)
msg_box = QMessageBox(QMessageBox.Information, '成功', '图像保存成功,保存路径为:' + fileName)
msg_box.exec_()
else:
msg_box = QMessageBox(QMessageBox.Warning, '提示', '没有生成图像')
msg_box.exec_()
def laplacian_save(self):
if self.unit4_laplacianimg.size > 1:
fileName, tmp = QFileDialog.getSaveFileName(self, '保存图像', 'Image', '*.png *.jpg *.bmp *.jpeg')
if fileName == '':
return
cv2.imwrite(fileName, self.unit4_laplacianimg)
msg_box = QMessageBox(QMessageBox.Information, '成功', '图像保存成功,保存路径为:' + fileName)
msg_box.exec_()
else:
msg_box = QMessageBox(QMessageBox.Warning, '提示', '没有生成图像')
msg_box.exec_()
def sobel_save(self):
if self.unit4_sobelimg.size > 1:
fileName, tmp = QFileDialog.getSaveFileName(self, '保存图像', 'Image', '*.png *.jpg *.bmp *.jpeg')
if fileName == '':
return
cv2.imwrite(fileName, self.unit4_laplacianimg)
msg_box = QMessageBox(QMessageBox.Information, '成功', '图像保存成功,保存路径为:' + fileName)
msg_box.exec_()
else:
msg_box = QMessageBox(QMessageBox.Warning, '提示', '没有生成图像')
msg_box.exec_()
def prewitt_save(self):
if self.unit4_prewittimg.size > 1:
fileName, tmp = QFileDialog.getSaveFileName(self, '保存图像', 'Image', '*.png *.jpg *.bmp *.jpeg')
if fileName == '':
return
cv2.imwrite(fileName, self.unit4_prewittimg)
msg_box = QMessageBox(QMessageBox.Information, '成功', '图像保存成功,保存路径为:' + fileName)
msg_box.exec_()
else:
msg_box = QMessageBox(QMessageBox.Warning, '提示', '没有生成图像')
msg_box.exec_()
def roberts_save(self):
if self.unit4_robertsimg.size > 1:
fileName, tmp = QFileDialog.getSaveFileName(self, '保存图像', 'Image', '*.png *.jpg *.bmp *.jpeg')
if fileName == '':
return
cv2.imwrite(fileName, self.unit4_robertsimg)
msg_box = QMessageBox(QMessageBox.Information, '成功', '图像保存成功,保存路径为:' + fileName)
msg_box.exec_()
else:
msg_box = QMessageBox(QMessageBox.Warning, '提示', '没有生成图像')
msg_box.exec_()