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())