编程语言
首页 > 编程语言> > python-在大图像中绘制边界框

python-在大图像中绘制边界框

作者:互联网

enter image description here

我有一个很大的二进制图像(4k x 7k pix),我想从中提取整个黄色部分作为单个矩形.我尝试使用二进制腐蚀来使黄色区域内的特征均匀.然后,我使用了skimage.regionprops的bbox方法,但对于具有一个大bbox的大图像而言,它似乎运行得不够快.你有什么建议吗?

解决方法:

由于您提供的图像包含分散注意力的轴,并且颜色错误且尺寸过小,因此我在终端机中使用ImageMagick创建了尽可能逼真的版本,如下所示:

convert bbox.png -alpha off -crop 120x215+40+13 -colorspace gray -normalize -threshold 50% -scale 4200x7200\! bbox.png

enter image description here

完整尺寸为4200×7200.

然后,我编写了一个基于numpy的bbox版本,如下所示

#!/usr/local/bin/python3
import numpy as np
from PIL import Image

def bbox(image):
    """Find bounding box of image"""
    # Project all columns into row same width as image
    proj=np.any(image,axis=0)
    # Find first non-zero value from Left
    L=np.argmax(proj)
    # And right
    R=image.shape[1]-np.argmax(np.flipud(proj))-1
    # Project all rows into column same height as image
    proj=np.any(image,axis=1)
    # Find first non-zero value from Top
    T=np.argmax(proj)
    # And Bottom
    B=image.shape[0]-np.argmax(np.flipud(proj))-1
    return T,L,B,R

image=np.array(Image.open("a.png").convert("L"))
print(bbox(image))

在我的Mac上运行时间为5.3毫秒.只是为了好玩,我将其穿线并在单独的平行线程上运行了水平投影和垂直投影,结果降至3.6ms,结果相同.

#!/usr/local/bin/python3
import numpy as np
from PIL import Image

import threading
import queue

def DoOneDim(image,axis,q):
    """Find bounding box of image"""
    proj=np.any(image,axis=axis)
    # Find first non-zero value
    A=np.argmax(proj)
    # And and last
    B=image.shape[1-axis]-np.argmax(np.flipud(proj))-1
    q.put({axis:(A,B)})


def bboxTh(image):
    """Threaded version of bbox() that does vertical and horizontal on their own theads"""
    q = queue.Queue()
    Hthread=threading.Thread(target=DoOneDim, args=(image,0,q))
    Vthread=threading.Thread(target=DoOneDim, args=(image,1,q))
    Hthread.start()
    Vthread.start()
    Hthread.join()
    Vthread.join()
    results=dict()
    while not q.empty():
       results.update(q.get())
    return results

image=np.array(Image.open("a.png").convert("L"))
print(bboxTh(image))

标识的框如下所示:

enter image description here

标签:bounding-box,scikit-image,python,image-processing,image-morphology
来源: https://codeday.me/bug/20191011/1894805.html