欢迎访问宙启技术站
智能推送

PyQt5.QtGui.QImage实现图像的边缘检测与轮廓提取

发布时间:2024-01-13 06:27:25

PyQt5是一个流行的Python库,用于创建桌面应用程序和图形用户界面(GUI)。PyQt5.QtGui模块提供了许多绘图和图像处理功能,其中包括PyQt5.QtGui.QImage类,它可以用于加载、处理和保存图像。

边缘检测和轮廓提取是图像处理和计算机视觉中常用的技术。边缘检测可以用于检测图像中的物体边界,而轮廓提取可以用于从图像中提取出物体的轮廓。

下面是一个使用PyQt5.QtGui.QImage实现图像的边缘检测和轮廓提取的例子:

from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget
from PyQt5.QtGui import QImage, QPixmap, QPainter, QColor, QPen
from PyQt5.QtCore import Qt

import cv2
import numpy as np

class ImageProcessingWidget(QWidget):
    def __init__(self, image_path):
        super().__init__()

        # 加载图像
        image = cv2.imread(image_path)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        self.image = QImage(image.data, image.shape[1], image.shape[0], QImage.Format_RGB888)

        # 创建标签,并显示原始图像
        self.image_label = QLabel()
        self.image_label.setPixmap(QPixmap.fromImage(self.image))

        # 创建垂直布局,并将标签添加到布局中
        layout = QVBoxLayout()
        layout.addWidget(self.image_label)

        # 设置布局为窗口的布局
        self.setLayout(layout)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setPen(QPen(Qt.red, 2))

        # 转换图像为灰度图
        gray_image = cv2.cvtColor(self.image, cv2.COLOR_RGB2GRAY)

        # 边缘检测
        edges = cv2.Canny(gray_image, 50, 150)

        # 构建轮廓信息
        contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        # 绘制边缘和轮廓
        for contour in contours:
            painter.drawPolygon([Qt.Point(*point[0]) for point in contour])

    def sizeHint(self):
        return self.image.size()

if __name__ == "__main__":
    image_path = "path/to/your/image.jpg"

    app = QApplication([])
    window = QWidget()
    layout = QVBoxLayout()
    window.setLayout(layout)

    image_processing_widget = ImageProcessingWidget(image_path)
    layout.addWidget(image_processing_widget)

    window.show()
    app.exec_()

在这个例子中,我们首先加载一张图像,然后将其转换为PyQt5.QtGui.QImage对象,并使用QLabel显示原始图像。然后,我们通过重写QWidget的paintEvent方法在窗口中绘制边缘和轮廓。

在paintEvent方法中,首先将图像转换为灰度图,然后使用cv2.Canny函数进行边缘检测,得到一张二值图。然后,使用cv2.findContours函数从二值图中提取轮廓信息,并将其绘制到窗口上。

最后,我们创建一个QApplication实例,并在一个QWidget窗口中显示图像处理小部件。

你可以替换image_path变量的值为你自己的图像路径,然后运行代码,即可看到边缘检测和轮廓提取的结果。