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.
275 lines
14 KiB
275 lines
14 KiB
import cv2
|
|
import numpy as np
|
|
from PyQt5.QtGui import *
|
|
from PyQt5.QtWidgets import *
|
|
|
|
# 子窗口布局
|
|
from sub_windows import ui_sub_window_3
|
|
|
|
|
|
class SubWindow(QMainWindow):
|
|
def __init__(self):
|
|
super().__init__(parent=None)
|
|
self.ui = ui_sub_window_3.Ui_Form()
|
|
self.ui.setupUi(self)
|
|
self.ui_init()
|
|
self.cv_srcImage = None
|
|
self.cv_noiseImage = None
|
|
self.cv_blurImage = None
|
|
|
|
def ui_init(self):
|
|
self._group_enable_ctrl()
|
|
# 下拉选择
|
|
noise_type_list = ['椒盐噪声', '高斯噪声', '乘积性噪声']
|
|
self.ui.comboBox_noise_type.addItems(noise_type_list)
|
|
self.ui.comboBox_noise_type.activated.connect(self.comboBox_noise_type_selected)
|
|
filter_type_list = ['均值滤波', '高斯滤波', '中值滤波', '双边滤波']
|
|
self.ui.comboBox_filter_type.addItems(filter_type_list)
|
|
self.ui.comboBox_filter_type.activated.connect(self.comboBox_filter_type_selected)
|
|
# 按钮
|
|
self.ui.pushButton_open_file.clicked.connect(self.open_file)
|
|
self.ui.pushButton_salt_pepper_noise.clicked.connect(self.salt_pepper_noise)
|
|
self.ui.pushButton_gasuss_noise.clicked.connect(self.gasuss_noise)
|
|
self.ui.pushButton_speckle_noise.clicked.connect(self.speckle_noise)
|
|
self.ui.pushButton_mean_blur_filter.clicked.connect(self.mean_blur_filter)
|
|
self.ui.pushButton_gauss_blur_filter.clicked.connect(self.gauss_blur_filter)
|
|
self.ui.pushButton_median_blur_filter.clicked.connect(self.median_blur_filter)
|
|
self.ui.pushButton_double_blur_filter.clicked.connect(self.double_blur_filter)
|
|
|
|
def _group_enable_ctrl(self, flag=None):
|
|
if flag is None:
|
|
self.ui.groupBox_salt_noise.setEnabled(False)
|
|
self.ui.groupBox_gauss_noise.setEnabled(False)
|
|
self.ui.groupBox_speckle_noise.setEnabled(False)
|
|
self.ui.groupBox_mean_blur_filter.setEnabled(False)
|
|
self.ui.groupBox_gauss_blur_filter.setEnabled(False)
|
|
self.ui.groupBox_median_blur_filter.setEnabled(False)
|
|
self.ui.groupBox_double_blur_filter.setEnabled(False)
|
|
elif flag == '椒盐噪声' and self.cv_srcImage is not None:
|
|
self.ui.groupBox_salt_noise.setEnabled(True)
|
|
self.ui.groupBox_gauss_noise.setEnabled(False)
|
|
self.ui.groupBox_speckle_noise.setEnabled(False)
|
|
elif flag == '高斯噪声' and self.cv_srcImage is not None:
|
|
self.ui.groupBox_salt_noise.setEnabled(False)
|
|
self.ui.groupBox_gauss_noise.setEnabled(True)
|
|
self.ui.groupBox_speckle_noise.setEnabled(False)
|
|
elif flag == '乘积性噪声' and self.cv_srcImage is not None:
|
|
self.ui.groupBox_salt_noise.setEnabled(False)
|
|
self.ui.groupBox_gauss_noise.setEnabled(False)
|
|
self.ui.groupBox_speckle_noise.setEnabled(True)
|
|
elif flag == '均值滤波' and self.cv_srcImage is not None:
|
|
self.ui.groupBox_mean_blur_filter.setEnabled(True)
|
|
self.ui.groupBox_gauss_blur_filter.setEnabled(False)
|
|
self.ui.groupBox_median_blur_filter.setEnabled(False)
|
|
self.ui.groupBox_double_blur_filter.setEnabled(False)
|
|
elif flag == '高斯滤波' and self.cv_srcImage is not None:
|
|
self.ui.groupBox_mean_blur_filter.setEnabled(False)
|
|
self.ui.groupBox_gauss_blur_filter.setEnabled(True)
|
|
self.ui.groupBox_median_blur_filter.setEnabled(False)
|
|
self.ui.groupBox_double_blur_filter.setEnabled(False)
|
|
elif flag == '中值滤波' and self.cv_srcImage is not None:
|
|
self.ui.groupBox_mean_blur_filter.setEnabled(False)
|
|
self.ui.groupBox_gauss_blur_filter.setEnabled(False)
|
|
self.ui.groupBox_median_blur_filter.setEnabled(True)
|
|
self.ui.groupBox_double_blur_filter.setEnabled(False)
|
|
elif flag == '双边滤波' and self.cv_srcImage is not None:
|
|
self.ui.groupBox_mean_blur_filter.setEnabled(False)
|
|
self.ui.groupBox_gauss_blur_filter.setEnabled(False)
|
|
self.ui.groupBox_median_blur_filter.setEnabled(False)
|
|
self.ui.groupBox_double_blur_filter.setEnabled(True)
|
|
|
|
def open_file(self):
|
|
file_path, file_type = QFileDialog.getOpenFileName(QFileDialog(), '选择图片', '', '*.jpg *.bmp *.png *tif')
|
|
self.cv_srcImage = cv2.imread(file_path)
|
|
if self.cv_srcImage is not None:
|
|
height, width, channels = self.cv_srcImage.shape
|
|
ui_image = QImage(cv2.cvtColor(self.cv_srcImage, cv2.COLOR_BGR2RGB), width, height, QImage.Format_RGB888)
|
|
if width > height:
|
|
ui_image = ui_image.scaledToWidth(self.ui.label_image_1.width())
|
|
else:
|
|
ui_image = ui_image.scaledToHeight(self.ui.label_image_1.height())
|
|
self.ui.label_image_1.setPixmap(QPixmap.fromImage(ui_image))
|
|
|
|
def comboBox_noise_type_selected(self):
|
|
selected = self.ui.comboBox_noise_type.currentText()
|
|
self._group_enable_ctrl(flag=selected)
|
|
|
|
def comboBox_filter_type_selected(self):
|
|
selected = self.ui.comboBox_filter_type.currentText()
|
|
self._group_enable_ctrl(flag=selected)
|
|
|
|
def salt_pepper_noise(self):
|
|
def _salt_pepper_noise(image, proportion, mode=1):
|
|
copyImage = image.copy()
|
|
height, width, channels = copyImage.shape
|
|
noise_pixel_num = int(height * width * proportion)
|
|
if mode == 1 and channels == 3:
|
|
for k in range(noise_pixel_num):
|
|
x_axis = int(np.random.random() * width)
|
|
y_axis = int(np.random.random() * height)
|
|
salt_pepper_flag = np.random.choice((True, False))
|
|
copyImage[y_axis, x_axis, 0] = 255 if salt_pepper_flag else 0
|
|
copyImage[y_axis, x_axis, 1] = 255 if salt_pepper_flag else 0
|
|
copyImage[y_axis, x_axis, 2] = 255 if salt_pepper_flag else 0
|
|
return copyImage
|
|
elif mode == 1 and channels == 2:
|
|
for k in range(noise_pixel_num):
|
|
x_axis = int(np.random.random() * width)
|
|
y_axis = int(np.random.random() * height)
|
|
salt_pepper_flag = np.random.choice((True, False))
|
|
copyImage[y_axis, x_axis] = 255 if salt_pepper_flag else 0
|
|
return copyImage
|
|
elif mode == 2 and channels == 3:
|
|
for k in range(noise_pixel_num):
|
|
x_axis = int(np.random.random() * width)
|
|
y_axis = int(np.random.random() * height)
|
|
copyImage[y_axis, x_axis, 0] = 255
|
|
copyImage[y_axis, x_axis, 1] = 255
|
|
copyImage[y_axis, x_axis, 2] = 255
|
|
return copyImage
|
|
elif mode == 2 and channels == 2:
|
|
for k in range(noise_pixel_num):
|
|
x_axis = int(np.random.random() * width)
|
|
y_axis = int(np.random.random() * height)
|
|
copyImage[y_axis, x_axis] = 255
|
|
return copyImage
|
|
elif mode == 3 and channels == 3:
|
|
for k in range(noise_pixel_num):
|
|
x_axis = int(np.random.random() * width)
|
|
y_axis = int(np.random.random() * height)
|
|
copyImage[y_axis, x_axis, 0] = 0
|
|
copyImage[y_axis, x_axis, 1] = 0
|
|
copyImage[y_axis, x_axis, 2] = 0
|
|
return copyImage
|
|
elif mode == 3 and channels == 3:
|
|
for k in range(noise_pixel_num):
|
|
x_axis = int(np.random.random() * width)
|
|
y_axis = int(np.random.random() * height)
|
|
copyImage[y_axis, x_axis] = 0
|
|
return copyImage
|
|
proportion = self.ui.doubleSpinBox_salt_proportion.value()
|
|
mode = 1
|
|
if self.ui.radioButton_1.isChecked():
|
|
mode = 1
|
|
elif self.ui.radioButton_2.isChecked():
|
|
mode = 2
|
|
elif self.ui.radioButton_3.isChecked():
|
|
mode = 3
|
|
self.cv_noiseImage = _salt_pepper_noise(image=self.cv_srcImage, proportion=proportion, mode=mode)
|
|
height, width, channels = self.cv_noiseImage.shape
|
|
ui_image = QImage(cv2.cvtColor(self.cv_noiseImage, cv2.COLOR_BGR2RGB), width, height, QImage.Format_RGB888)
|
|
if width > height:
|
|
ui_image = ui_image.scaledToWidth(self.ui.label_image_2.width())
|
|
else:
|
|
ui_image = ui_image.scaledToHeight(self.ui.label_image_2.height())
|
|
self.ui.label_image_2.setPixmap(QPixmap.fromImage(ui_image))
|
|
|
|
def gasuss_noise(self):
|
|
def _gasuss_noise(image, mean=0.0, var=0.1):
|
|
copyImage = image.copy()
|
|
noise = np.random.normal(loc=mean, scale=var, size=copyImage.shape)
|
|
copyImage = np.array(copyImage / 255, dtype=float)
|
|
out = copyImage + noise
|
|
out = np.clip(out, 0.0, 1.0)
|
|
out = np.uint8(out * 255)
|
|
return out
|
|
mean = self.ui.doubleSpinBox_gauss_mean.value()
|
|
var = self.ui.doubleSpinBox_gauss_var.value()
|
|
self.cv_noiseImage = _gasuss_noise(image=self.cv_srcImage, mean=mean, var=var)
|
|
height, width, channels = self.cv_noiseImage.shape
|
|
ui_image = QImage(cv2.cvtColor(self.cv_noiseImage, cv2.COLOR_BGR2RGB), width, height, QImage.Format_RGB888)
|
|
if width > height:
|
|
ui_image = ui_image.scaledToWidth(self.ui.label_image_2.width())
|
|
else:
|
|
ui_image = ui_image.scaledToHeight(self.ui.label_image_2.height())
|
|
self.ui.label_image_2.setPixmap(QPixmap.fromImage(ui_image))
|
|
|
|
def speckle_noise(self):
|
|
def _speckle_noise(image, mean=0.0, var=0.2):
|
|
copyImage = image.copy()
|
|
noise = np.random.normal(loc=mean, scale=var, size=copyImage.shape)
|
|
copyImage = np.array(copyImage / 255, dtype=float)
|
|
out = (1 + noise) * copyImage
|
|
out = np.clip(out, 0.0, 1.0)
|
|
out = np.uint8(out * 255)
|
|
return out
|
|
|
|
mean = self.ui.doubleSpinBox_speckle_mean.value()
|
|
var = self.ui.doubleSpinBox_speckle_var.value()
|
|
self.cv_noiseImage = _speckle_noise(image=self.cv_srcImage, mean=mean, var=var)
|
|
height, width, channels = self.cv_noiseImage.shape
|
|
ui_image = QImage(cv2.cvtColor(self.cv_noiseImage, cv2.COLOR_BGR2RGB), width, height, QImage.Format_RGB888)
|
|
if width > height:
|
|
ui_image = ui_image.scaledToWidth(self.ui.label_image_2.width())
|
|
else:
|
|
ui_image = ui_image.scaledToHeight(self.ui.label_image_2.height())
|
|
self.ui.label_image_2.setPixmap(QPixmap.fromImage(ui_image))
|
|
|
|
def mean_blur_filter(self):
|
|
def _mean_blur_filter(image, size=5):
|
|
copyImage = image.copy()
|
|
if int(size) % 2 == 0:
|
|
return None
|
|
copyImage = cv2.blur(copyImage, ksize=(int(size), int(size)))
|
|
return copyImage
|
|
size = self.ui.spinBox_mean_ksize.value()
|
|
self.cv_blurImage = _mean_blur_filter(image=self.cv_noiseImage, size=size)
|
|
height, width, channels = self.cv_blurImage.shape
|
|
ui_image = QImage(cv2.cvtColor(self.cv_blurImage, cv2.COLOR_BGR2RGB), width, height, QImage.Format_RGB888)
|
|
if width > height:
|
|
ui_image = ui_image.scaledToWidth(self.ui.label_image_3.width())
|
|
else:
|
|
ui_image = ui_image.scaledToHeight(self.ui.label_image_3.height())
|
|
self.ui.label_image_3.setPixmap(QPixmap.fromImage(ui_image))
|
|
|
|
def gauss_blur_filter(self):
|
|
def _gauss_blur_filter(image, size=5):
|
|
copyImage = image.copy()
|
|
if int(size) % 2 == 0:
|
|
return None
|
|
copyImage = cv2.GaussianBlur(copyImage, ksize=(int(size), int(size)), sigmaX=0, sigmaY=0)
|
|
return copyImage
|
|
size = self.ui.spinBox_gauss_blur_ksize.value()
|
|
self.cv_blurImage = _gauss_blur_filter(image=self.cv_noiseImage, size=size)
|
|
height, width, channels = self.cv_blurImage.shape
|
|
ui_image = QImage(cv2.cvtColor(self.cv_blurImage, cv2.COLOR_BGR2RGB), width, height, QImage.Format_RGB888)
|
|
if width > height:
|
|
ui_image = ui_image.scaledToWidth(self.ui.label_image_3.width())
|
|
else:
|
|
ui_image = ui_image.scaledToHeight(self.ui.label_image_3.height())
|
|
self.ui.label_image_3.setPixmap(QPixmap.fromImage(ui_image))
|
|
|
|
def median_blur_filter(self):
|
|
def _median_blur_filter(image, size=5):
|
|
copyImage = image.copy()
|
|
if int(size) % 2 == 0:
|
|
return None
|
|
copyImage = cv2.medianBlur(copyImage, ksize=int(size))
|
|
return copyImage
|
|
size = self.ui.spinBox_median_ksize.value()
|
|
self.cv_blurImage = _median_blur_filter(image=self.cv_noiseImage, size=size)
|
|
height, width, channels = self.cv_blurImage.shape
|
|
ui_image = QImage(cv2.cvtColor(self.cv_blurImage, cv2.COLOR_BGR2RGB), width, height, QImage.Format_RGB888)
|
|
if width > height:
|
|
ui_image = ui_image.scaledToWidth(self.ui.label_image_3.width())
|
|
else:
|
|
ui_image = ui_image.scaledToHeight(self.ui.label_image_3.height())
|
|
self.ui.label_image_3.setPixmap(QPixmap.fromImage(ui_image))
|
|
|
|
def double_blur_filter(self):
|
|
def _double_blur_filter(image):
|
|
copyImage = image.copy()
|
|
copyImage = cv2.bilateralFilter(copyImage, d=25, sigmaColor=25 * 2, sigmaSpace=25 / 2)
|
|
return copyImage
|
|
self.cv_blurImage = _double_blur_filter(image=self.cv_srcImage)
|
|
height, width, channels = self.cv_blurImage.shape
|
|
ui_image = QImage(cv2.cvtColor(self.cv_blurImage, cv2.COLOR_BGR2RGB), width, height, QImage.Format_RGB888)
|
|
if width > height:
|
|
ui_image = ui_image.scaledToWidth(self.ui.label_image_3.width())
|
|
else:
|
|
ui_image = ui_image.scaledToHeight(self.ui.label_image_3.height())
|
|
self.ui.label_image_3.setPixmap(QPixmap.fromImage(ui_image))
|
|
cv2.namedWindow('haha', cv2.WINDOW_NORMAL)
|
|
cv2.imshow('haha', self.cv_blurImage)
|
|
cv2.waitKey(0)
|