目录
1、创建一个 PyQt 应用程序,该应用程序能够满足以下要求:
代码:
运行结果:
2、创建一个 PyQt 应用程序,该应用程序能够满足以下要求:
代码:
运行结果:
3、创建一个 PyQt 应用程序,该应用程序能够满足以下要求:
代码:
运行结果:
4、请编写一段Python代码,实现以下功能:
代码:
运行结果:
5、请编写一段Python代码,实现以下功能:
代码:
运行结果:
1、创建一个 PyQt 应用程序,该应用程序能够满足以下要求:
代码:
"""1.使用 OpenCV 加载一张图像。
2.在 PyQt 的窗口中显示这张图像。
3.提供四个按钮(QPushButton):
- 一个用于将图像转换为灰度图
- 一个用于将图像恢复为原始彩色图
- 一个用于将图像进行翻转
- 一个用于将图像进行旋转
4.当用户点击按钮时,相应地更新窗口中显示的图像。"""import sys
import cv2
from PyQt6.QtGui import QPixmap, QImage
from PyQt6.QtWidgets import QWidget, QApplication, QLabel, QPushButton# 封装一个窗口
class MyWindow(QWidget):# 初始化窗口def __init__(self):super().__init__()self.setWindowTitle("img")self.resize(700,540)# 读取图片self.image=cv2.imread("./pictures/roi_color.png")# 转换图像格式 转为RGBself.original_image=cv2.cvtColor(self.image,cv2.COLOR_BGR2RGB)self.image2=self.original_image.copy()# 搭建一个label显示图片self.img_label=QLabel(self)self.img_label.resize(500,500)self.img_label.move(20,20)self.show_img()# 创建四个按钮to_gray=QPushButton("To_gray",self)to_gray.resize(100,50)to_gray.move(550,50)restore = QPushButton("Restore", self)restore.resize(100, 50)restore.move(550, 150)flip = QPushButton("Flip", self)flip.resize(100, 50)flip.move(550, 250)revolve = QPushButton("Revolve", self)revolve.resize(100, 50)revolve.move(550, 350)# 连接按钮与功能槽函数to_gray.clicked.connect(self.gray_slot)restore.clicked.connect(self.restore_slot)flip.clicked.connect(self.flip_slot)revolve.clicked.connect(self.revolve_slot)# 显示图像def show_img(self):# 获取图像的高、宽、通道数h,w,channel=self.image2.shape# 每行字节数=通道数✖宽bytes_per_line=channel*wqt_img=QImage(self.image2.data,w,h,bytes_per_line,QImage.Format.Format_RGB888 # 使用预转换的RGB格式)self.img_label.setPixmap(QPixmap.fromImage(qt_img))self.img_label.setScaledContents(True)# 将图像转换为灰度图def gray_slot(self):img_gray=cv2.cvtColor(self.image,cv2.COLOR_BGR2GRAY)# 保持三通道格式self.image2=cv2.cvtColor(img_gray,cv2.COLOR_GRAY2RGB)self.show_img()# 图像恢复为彩色def restore_slot(self):self.image2=self.original_image.copy()self.show_img()# 图像翻转def flip_slot(self):self.image2=cv2.flip(self.image2,1)self.show_img()def revolve_slot(self):h,w,_=self.image2.shapem=cv2.getRotationMatrix2D((w//2,h//2),90,1)self.image2=cv2.warpAffine(self.image2,m,(w,h),borderMode=cv2.BORDER_REFLECT)self.show_img()
if __name__ == '__main__':app=QApplication(sys.argv)myWindow=MyWindow()myWindow.show()sys.exit(app.exec())
运行结果:
对图像进行灰度、恢复、翻转和旋转操作
2、创建一个 PyQt 应用程序,该应用程序能够满足以下要求:
代码:
"""1.使用 OpenCV 加载一张彩色图像,并在 PyQt 的窗口中显示它。
2.提供一个滑动条(QSlider),允许用户调整图像的亮度。
3.当用户调整滑动条时,实时更新窗口中显示的图像亮度。
4.添加另一个滑动条(QSlider),允许用户调整图像的对比度。
5.当用户调整滚动条时,实时更新窗口中显示的图像对比度。
6.提供一个按钮(QPushButton),允许用户将图像保存为新的文件。
7.当用户点击保存按钮时,将调整后的图像保存到指定的路径,OpenCV中使用cv2.imwrite()来保存图片。"""import os
import sys
import timeimport cv2
import numpy as np
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QPixmap, QImage
from PyQt6.QtWidgets import QWidget, QApplication, QLabel, QPushButton, QSlider, QMessageBox# 封装一个窗口
class MyWindow(QWidget):# 初始化窗口def __init__(self):super().__init__()self.setWindowTitle("img")self.resize(550,540)# 读取图片self.image=cv2.imread("./pictures/dog.jpg")# 转换图像格式 转为RGBself.original_image=cv2.cvtColor(self.image,cv2.COLOR_BGR2RGB)self.image2=self.original_image.copy()# 搭建一个label显示图片self.img_label=QLabel(self)self.img_label.resize(400,400)self.img_label.move(20,20)self.show_img()# 创建滑动条调整亮度 创建标签显示文本self.brightness = QSlider(Qt.Orientation.Horizontal,self) # 创建水平滑动条self.brightness.move(20,470)self.brightness.resize(400,30)self.brightness.setRange(-100,100)label1=QLabel("调节亮度",self)label1.move(20,450)# 创建滑动条调整对比度self.contrast = QSlider(Qt.Orientation.Vertical, self) # 创建水平滑动条self.contrast.move(470, 45)self.contrast.resize(30, 400)self.contrast.setRange(-100,100)label2= QLabel("调节对比度", self)label2.move(460, 20)# 创建保存按钮to_save=QPushButton("Save",self)to_save.resize(100,50)to_save.move(435,460)# 连接功能槽函数self.brightness.valueChanged.connect(self.bright_contrast_slot)self.contrast.valueChanged.connect(self.bright_contrast_slot)to_save.clicked.connect(self.save_slot)# 显示图像def show_img(self):# 获取图像的高、宽、通道数h,w,channel=self.image2.shape# 每行字节数=通道数✖宽bytes_per_line=channel*wqt_img=QImage(self.image2.data,w,h,bytes_per_line,QImage.Format.Format_RGB888 # 使用预转换的RGB格式)self.img_label.setPixmap(QPixmap.fromImage(qt_img))self.img_label.setScaledContents(True)# 亮度/对比度调整def bright_contrast_slot(self):# 获取滑动条的数值brightness=self.brightness.value()*0.5contrast=1+(self.contrast.value()/100)*2temp_img = self.original_image.astype(np.float32)temp_img = (temp_img-128) * contrast +128+ brightness # 对比度乘法 + 亮度加法self.image2 = np.clip(temp_img, 0, 255).astype(np.uint8)self.show_img()# 保存图像def save_slot(self):try:now_time=time.strftime("%Y%m%d_%H%M%S")save_dir= 'hw2_img'save_path=os.path.join(save_dir,f"img{now_time}.jpg")cv2.imwrite(save_path,cv2.cvtColor(self.image2,cv2.COLOR_RGB2BGR))QMessageBox.information(self,"Save","保存图片成功!")except cv2.error as e:print(e)if __name__ == '__main__':app=QApplication(sys.argv)myWindow=MyWindow()myWindow.show()sys.exit(app.exec())
运行结果:
调节图像的亮度和对比度
3、创建一个 PyQt 应用程序,该应用程序能够满足以下要求:
代码:
"""1.使用 OpenCV 加载一张图像。
2.在 PyQt 的窗口中显示这张图像。
3.提供一个下拉列表(QComboBox),对图像做(模糊、锐化、边缘检测)处理:
- 模糊——使用cv2.GaussianBlur()实现
- 锐化——使用cv2.Laplacian()、cv2.Sobel()实现
- 边缘检测——使用cv2.Canny()实现
4.当用户点击下拉列表选项时,相应地更新窗口中显示的图像。
5.提供一个按钮,当用户点击按钮时,能保存调整后的图像"""import os
import sys
import timeimport cv2
import numpy as np
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QPixmap, QImage
from PyQt6.QtWidgets import QWidget, QApplication, QLabel, QPushButton, QSlider, QMessageBox, QComboBox# 封装一个窗口
class MyWindow(QWidget):# 初始化窗口def __init__(self):super().__init__()self.setWindowTitle("img")self.resize(600,450)# 读取图片self.image=cv2.imread("./pictures/dog.jpg")# 转换图像格式 转为RGBself.original_image=cv2.cvtColor(self.image,cv2.COLOR_BGR2RGB)self.image2=self.original_image.copy()# 搭建一个label显示图片self.img_label=QLabel(self)self.img_label.resize(400,400)self.img_label.move(25,25)self.show_img()# 创建一个下拉列表 包含模糊 锐化 边缘检测self.combo=QComboBox(self)self.combo.move(450,30)self.combo.resize(125,30)self.combo.setPlaceholderText("请选择具体功能")self.combo.addItems(["模糊图像","锐化图像","图像边缘检测"])# 创建保存按钮to_save = QPushButton("Save", self)to_save.resize(100, 50)to_save.move(450, 350)# 连接功能槽函数self.combo.currentIndexChanged.connect(self.img_edit)to_save.clicked.connect(self.save_slot)# 显示图像def show_img(self):# 获取图像的高、宽、通道数h,w,channel=self.image2.shape# 每行字节数=通道数✖宽bytes_per_line=channel*wqt_img=QImage(self.image2.data,w,h,bytes_per_line,QImage.Format.Format_RGB888 # 使用预转换的RGB格式)self.img_label.setPixmap(QPixmap.fromImage(qt_img))self.img_label.setScaledContents(True)# 图像编辑def img_edit(self):selection=self.combo.currentText()self.image2=self.original_image.copy()if selection=="模糊图像":try:self.image2=cv2.GaussianBlur(self.image2,(15,15),5)self.show_img()except cv2.error as e:print(e)elif selection=="锐化图像":try:kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])self.image2 = cv2.filter2D(self.image2, -1, kernel)self.show_img()except cv2.error as e:print(e)elif selection=="图像边缘检测":# 灰度化 边缘检测img_gray=cv2.cvtColor(self.image2,cv2.COLOR_BGR2GRAY)self.image2 = cv2.Canny(img_gray, 30, 70)self.image2=cv2.cvtColor(self.image2,cv2.COLOR_GRAY2RGB)self.show_img()# 保存图像def save_slot(self):try:now_time = time.strftime("%Y%m%d_%H%M%S")save_dir = './hw3_img'save_path = os.path.join(save_dir, f"img{now_time}.jpg")cv2.imwrite(save_path, cv2.cvtColor(self.image2, cv2.COLOR_RGB2BGR))QMessageBox.information(self, "Save", "保存图片成功!")except cv2.error as e:print(e)if __name__ == '__main__':app=QApplication(sys.argv)myWindow=MyWindow()myWindow.show()sys.exit(app.exec())
运行结果:
对图像进行模糊、锐化和边缘提取操作
4、请编写一段Python代码,实现以下功能:
代码:
"""1.读取一张二维码图片
2.进行二值化处理和形态学操作,获取二维码轮廓
3.通过轮廓外接特征检测或者多边形逼近等获取 二维码的四个点
4.进行透视变换,矫正二维码图像"""import cv2
import numpy as np# 读取二维码图片
original_img=cv2.imread("./pictures/t_d_code.png")
img=original_img
# 灰度化
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 二值化处理
_,img_thresh=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
# 高斯滤波
img_blur=cv2.GaussianBlur(img_thresh,(5,5),7)
# 寻找轮廓
contours,_=cv2.findContours(img_blur,mode=cv2.RETR_LIST, #查找轮廓的方式method=cv2.CHAIN_APPROX_SIMPLE #轮廓的近似方式)
# 多边形逼近
cnt=sorted(contours,key=cv2.contourArea,reverse=True)[0]
# 对最大轮廓做逼近
zc=cv2.arcLength(cnt,True)
approx=cv2.approxPolyDP(cnt,zc*0.1,True)
print(approx)
# 绘制逼近后的轮廓
cv2.drawContours(img, [approx], -1, (0,0,255),2)
# 进行矫正
src = np.float32(approx).reshape(-1, 2)
x = src[:, 0]
y = src[:, 1]
dst = np.float32([[min(x), min(y)],[min(x), max(y)],[max(x), max(y)],[max(x), min(y)]
])# 获取透视变换矩阵
M = cv2.getPerspectiveTransform(src, dst)
# 进行透视变换
img_Perspective = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0]))cv2.imshow("img",img)
cv2.imshow("img_Perspective",img_Perspective)
cv2.waitKey(0)
运行结果:
5、请编写一段Python代码,实现以下功能:
代码:
"""1.读取一张彩色图像
2.制作要提取颜色的掩膜[玫瑰的颜色]
3.输出抠图后的前景图 和 背景图"""import cv2
import numpy as np# 读取图像
image = cv2.imread("./roses/roi.jpg")
# 转换到hsv色彩空间
img_HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
# 定义玫瑰颜色HSV范围
lower_red1 = np.array([0,43,46])
upper_red1 = np.array([25,255,255])
lower_red2 = np.array([100,43,46])
upper_red2 = np.array([180,255,255])
# 创建玫瑰颜色掩膜
mask1 = cv2.inRange(img_HSV,lower_red1,upper_red1)
mask2 = cv2.inRange(img_HSV,lower_red2,upper_red2)
mask = cv2.bitwise_or(mask1,mask2)# 生成前景和背景
foreground = cv2.bitwise_and(image, image, mask=mask)
background = cv2.bitwise_and(image, image, mask=cv2.bitwise_not(mask))# 创建可视化结果(带边框标记)
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
result = image.copy()
cv2.drawContours(result, contours, -1, (0, 255, 0), 2)cv2.imshow('Foreground', foreground)
cv2.imshow('Background', background)cv2.waitKey(0)