【问题标题】:Divide image into rectangles information in Python在Python中将图像划分为矩形信息
【发布时间】:2019-08-12 22:54:11
【问题描述】:

我有一系列图像,它们只不过是黑色背景中的一系列彩色矩形 示例:。我如何(在 Python 3.7 中使用 PIL)制作一个程序来识别这些矩形(xy 位置、颜色和大小)?效率并不是很重要,所以嵌套的fors 是可以接受的。到目前为止,我能够提出的每个算法都有很多缺陷,并且可能以多种不同的方式出错,或者只是太复杂了,根本不值得

【问题讨论】:

    标签: python image algorithm image-processing python-imaging-library


    【解决方案1】:

    您根本不需要编写任何代码,您可以使用 ImageMagick 来完成,它安装在大多数 Linux 发行版上,适用于 macOS 和 Windows。

    只需在终端(Windows 上的命令提示符)中,您就可以运行:

    magick convert image.png                            \
       -define connected-components:verbose=true        \
       -define connected-components:area-threshold=100  \
       -connected-components 4 -auto-level output.png
    

    样本输出

    Objects (id: bounding-box centroid area mean-color):
      0: 1200x714+0+0 651.2,369.3 703177 srgb(0,0,0)
      164: 1200x86+0+714 599.5,756.5 103200 srgb(255,21,0)
      2: 363x155+80+60 261.0,137.0 56265 srgb(255,255,255)
      26: 127x323+60+302 122.6,463.2 39668 srgb(255,255,255)
      54: 308x109+352+373 505.5,427.0 33572 srgb(255,255,255)
      1: 102x159+641+47 691.5,126.0 16218 srgb(255,255,255)
      53: 79x100+977+371 1016.0,420.5 7900 srgb(0,17,255)
    

    因此,查看从0: 开始的行,有一个尺寸为 1200x714 的矩形,从 0,0(左上角)开始,颜色为黑色,即 srgb(0,0,0)。

    查看下一行,有一个 1200x86 的矩形,从左上角向下 714 像素开始,颜色为红色,即 srgb(255,21,0)。

    等等。

    最后一行是一个 79x100 的矩形,位于 [977,31],颜色为蓝色,即 srgb(0,17,255)。

    【讨论】:

    • 好吧,我宁愿让代码直接打印出 UI 行(类似于“button = Button(340, 100, 20, 30, 'Ex. case')”),但考虑它,因为我可以(并且知道如何)在 python 上运行 os 命令,获取并解析输出,这真的很有帮助。谢谢。
    【解决方案2】:

    我不知道您对 OpenCV 的了解程度。

    如果你准备好使用 openCV,你可以使用 findContours 来获得想要的东西。

    下面是代码:

        import cv2
        readImage= cv2.imread(r"<ImagePath>\oKvDi.png")
        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
        #Code to Find edges of Square using Canny edge detection method and finding Contours and drawing in Back Line
    
        edges = cv2.Canny(img_gray, 0, 100)
        contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
        #Just for your reference to show all rectangles are found
        cv2.drawContours(readImage, contours, -1, (0, 0, 0), 5)
        cv2.imwrite(r"<ImageSavePath>/a.png",readImage)
    

    希望这能解决您的问题

    【讨论】:

    • 谢谢,我对使用 OpenCV 没有任何问题,只是在问题中说 PIL,因为我对自己在做什么有了更好的了解,那么如何获取有关矩形的数据?再说一次,我几乎是 OpenCV 的新手。如果我做对了contours 是关键,但我几乎不知道从这里做什么
    • 由于图像中只有矩形,您只需打印 contours 即可知道坐标
    • 好吧,在另一个只有 1 个矩形的图像中使用 print(contours) 后,我有这个:prntscr.com/n1g2md,问题是,我不知道如何处理所有这些数据。它似乎被分成7个一组,这真的让我很困惑
    • @Locked 你到底想用那个坐标做什么?
    • 只是为了获得图像上矩形的左上角坐标和大小,并打印它们,对于我正在制作的 UI,我不想重新每次更改元素的位置或大小时检查,所以我只需在图像编辑软件中制作 UI,将其放入该程序中,它会输出我需要知道的所有内容,以按照我想要的方式获得 UI
    猜你喜欢
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多