1.创建一个 PyQt 应用程序,该应用程序可以或许:
- 利用 OpenCV 加载一张图像。
- 在 PyQt 的窗口中显示这张图像。
- 提供四个按钮(QPushButton):
- 一个用于将图像转换为灰度图
- 一个用于将图像恢复为原始彩色图
- 一个用于将图像进行翻转
- 一个用于将图像进行旋转
- 当用户点击按钮时,相应地更新窗口中显示的图像。
代码:
- import sys
- import cv2
- from PyQt6.QtGui import QPixmap, QImage
- from PyQt6.QtWidgets import QApplication, QLabel
- from PyQt6 import uic
- # 全局变量保存当前图像
- current_image = None
- # 处理图像的函数
- def gray():
- global current_image
- if current_image is not None:
- img_gray = cv2.cvtColor(current_image, cv2.COLOR_BGR2GRAY)
- img_rgb = cv2.cvtColor(img_gray, cv2.COLOR_GRAY2RGB)
- current_image = img_rgb # 更新当前图像
- # 转换为 QPixmap 显示
- h, w, ch = img_rgb.shape
- bytes_per_line = 3 * w
- q_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
- ui.label.setPixmap(QPixmap.fromImage(q_img))
- ui.label.setScaledContents(True)
- else:
- print("图像加载失败")
- def img_RGB():
- global current_image
- img = cv2.imread('./1.png') # 重新加载原图
- if img is not None:
- img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
- current_image = img_rgb # 更新当前图像
- # 转换为 QPixmap 显示
- h, w, ch = img_rgb.shape
- bytes_per_line = 3 * w
- q_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
- ui.label.setPixmap(QPixmap.fromImage(q_img))
- ui.label.setScaledContents(True)
- else:
- print("图像加载失败")
- def fanzhuan():
- global current_image
- if current_image is not None:
- current_image = cv2.flip(current_image, 1) # 水平翻转
- # 转换为 RGB 以便显示
- img_rgb = cv2.cvtColor(current_image, cv2.COLOR_BGR2RGB)
- h, w, ch = img_rgb.shape
- bytes_per_line = 3 * w
- q_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
- ui.label.setPixmap(QPixmap.fromImage(q_img))
- ui.label.setScaledContents(True)
- else:
- print("图像加载失败")
- def xuanzhuan():
- global current_image
- if current_image is not None:
- h, w = current_image.shape[:2]
- center = (w // 2, h // 2)
- angle = 90 # 旋转角度
- M = cv2.getRotationMatrix2D(center, angle, 1.0)
- current_image = cv2.warpAffine(current_image, M, (w, h))
- # 转换为 RGB 以便显示
- img_rgb = cv2.cvtColor(current_image, cv2.COLOR_BGR2RGB)
- h, w, ch = img_rgb.shape
- bytes_per_line = 3 * w
- q_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
- ui.label.setPixmap(QPixmap.fromImage(q_img))
- ui.label.setScaledContents(True)
- else:
- print("图像加载失败")
- if __name__ == '__main__':
- app = QApplication(sys.argv)
- # 加载 UI 文件
- ui = uic.loadUi('./form.ui')
- # 初始加载图像
- img = cv2.imread('./1.png')
- if img is not None:
- img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
- current_image = img_rgb # 保存原始图像为当前图像
- # 转换为 QPixmap 显示
- h, w, ch = img_rgb.shape
- bytes_per_line = 3 * w
- q_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
- ui.label.setPixmap(QPixmap.fromImage(q_img))
- ui.label.setScaledContents(True)
- # 信号与槽的连接
- ui.btn1.clicked.connect(gray) # 灰度转换
- ui.btn2.clicked.connect(img_RGB) # 恢复 RGB
- ui.btn3.clicked.connect(fanzhuan) # 水平翻转
- ui.btn4.clicked.connect(xuanzhuan) # 旋转
- ui.show()
- sys.exit(app.exec())
复制代码
2.创建一个 PyQt 应用程序,该应用程序可以或许:
- 利用 OpenCV 加载一张彩色图像,并在 PyQt 的窗口中显示它。
- 提供一个滑动条(QSlider),答应用户调整图像的亮度。
- 当用户调整滑动条时,及时更新窗口中显示的图像亮度。
- 添加另一个滑动条(QSlider),答应用户调整图像的对比度。
- 当用户调整滚动条时,及时更新窗口中显示的图像对比度。
- 提供一个按钮(QPushButton),答应用户将图像生存为新的文件。
- 当用户点击生存按钮时,将调整后的图像生存到指定的路径,OpenCV中利用cv2.imwrite()来生存图片。
代码:
- import cv2
- from PyQt6 import uic
- from PyQt6.QtGui import QImage, QPixmap
- from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QSlider
- import sys
-
- class MyWidget(QWidget):
- def __init__(self):
- super().__init__()
- ui = uic.loadUi("form2.ui", self)
- self.img: QLabel = ui.img
- # 图片亮度调整
- self.gamer: QSlider = ui.gamer
- self.gamer.setMinimum(-100) # 设置亮度最小值
- self.gamer.setMaximum(100) # 设置亮度最大值
- self.gamer.setValue(0) # 设置初始值为 0
- self.gamer.valueChanged.connect(self.gamer_slot)
-
- # 图片对比度调整
- self.contrast: QSlider = ui.contrast_radio
- self.contrast.setMinimum(1) # 设置对比度最小值
- self.contrast.setMaximum(100) # 设置对比度最大值
- self.contrast.setValue(50) # 设置初始值为 50
- self.contrast.valueChanged.connect(self.contrast_slot)
- # 保存图片
- self.save: QPushButton = ui.save
- self.save.clicked.connect(self.save_slot)
- # 读取图片
- self.img_data = cv2.imread("flower.png")
- self.display_image(self.img_data)
-
- # 初始亮度和对比度增量
- self.initial_brightness = 0
- self.initial_contrast = 1.0
-
- def gamer_slot(self):
- # 计算亮度变化
- brightness_change = self.gamer.value() - self.initial_brightness
- self.initial_brightness = self.gamer.value()
-
- # 使用 addWeighted 来调整亮度
- self.img_data = cv2.addWeighted(self.img_data, 1.0, 0, 0, brightness_change)
- self.display_image(self.img_data)
-
- def contrast_slot(self):
- # 计算对比度变化
- contrast_change = self.contrast.value() - self.initial_contrast
- self.initial_contrast = self.contrast.value()
-
- # 根据对比度调整图像
- alpha = 1 + (contrast_change / 100.0) # 控制对比度变化的灵敏度
- self.img_data = cv2.convertScaleAbs(self.img_data, alpha=alpha, beta=0)
- self.display_image(self.img_data)
-
- def save_slot(self):
- cv2.imwrite("flower2.png", self.img_data)
-
- def display_image(self, img):
- if len(img.shape) == 2: # 灰度图没有 color channels
- img_rgb = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
- else:
- img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
-
- # 转换为 QPixmap
- h, w, ch = img_rgb.shape
- bytes_per_line = ch * w
- q_image = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
-
- # 显示图像
- self.img.setPixmap(QPixmap.fromImage(q_image))
- self.img.setScaledContents(True)
-
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- myWin = MyWidget()
- myWin.show()
- sys.exit(app.exec())
复制代码
3.创建一个 PyQt 应用程序,该应用程序可以或许:
- 利用 OpenCV 加载一张图像。
- 在 PyQt 的窗口中显示这张图像。
- 提供一个下拉列表(QComboBox),对图像做(含糊、锐化、边缘检测)处理:
- 含糊——利用cv2.GaussianBlur()实现
- 锐化——利用cv2.Laplacian()、cv2.Sobel()实现
- 边缘检测——利用cv2.Canny()实现
- 当用户点击下拉列表选项时,相应地更新窗口中显示的图像。
- 提供一个按钮,当用户点击按钮时,能生存调整后的图像。
代码:
- import cv2
- from PyQt6.QtGui import QImage, QPixmap
- from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QComboBox
- from PyQt6 import uic
- import sys
-
- class MyWidget(QWidget):
- def __init__(self):
- super().__init__()
- ui = uic.loadUi("form3.ui", self)
- self.img: QLabel = ui.label
- self.combox: QComboBox = ui.comboBox
- self.save: QPushButton = ui.save
-
- # 添加选项到下拉列表
- self.combox.addItems(["原图", "模糊", "锐化", "边缘检测"])
-
- # 加载图像
- self.img_data = cv2.imread("flower.png")
- self.modified_img = self.img_data # 当前显示的图像
- self.display_image(self.img_data)
-
- # 信号与槽连接
- self.combox.currentIndexChanged.connect(self.combox_slot)
- self.save.clicked.connect(self.save_image)
-
- def combox_slot(self, index):
- if index == 0:
- img = self.img_data
- elif index == 1:
- img = cv2.GaussianBlur(self.img_data, (5, 5), 0)
- elif index == 2:
- img = cv2.Laplacian(self.img_data, -1)
- elif index == 3:
- img = cv2.Canny(self.img_data, 100, 200)
- self.modified_img = img # 更新当前显示的图像
- self.display_image(img)
-
- def display_image(self, img):
- if len(img.shape) == 2: # 灰度图没有 color channels
- img_rgb = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
- else:
- img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
-
- # 转换为 QPixmap
- h, w, ch = img_rgb.shape
- bytes_per_line = ch * w
- q_image = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
-
- # 显示图像
- self.img.setPixmap(QPixmap.fromImage(q_image))
- self.img.setScaledContents(True)
-
- def save_image(self):
- if self.modified_img is not None:
- cv2.imwrite("output.png", self.modified_img)
- print("图像已保存为 output.png")
-
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- window = MyWidget()
- window.show()
- sys.exit(app.exec())
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |