python打出由边框包围的_python-在大图像中绘制边界框

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

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

完整尺寸为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))

标识的框如下所示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值