一张黑白灰度图里有多个白框,怎么用pillow库的getbbox()获取所有框的角点坐标
时间: 2023-03-20 20:01:06 浏览: 187
图像角点获取
使用 Pillow 库中的 getbbox() 函数可以获取黑白灰度图中最小的外接矩形框的四个角点坐标。但是如果图像中有多个白框,getbbox() 只能获取到最小的那个矩形框,无法获取所有的白框的角点坐标。
如果需要获取所有白框的角点坐标,可以使用 Pillow 库中的 findContours() 函数来进行轮廓检测,然后使用 minAreaRect() 函数获取每个白框的最小外接矩形框的角点坐标。具体步骤如下:
1. 将黑白灰度图转为二值图像,使白色部分为前景,黑色部分为背景。可以使用 threshold() 函数实现。
2. 使用 findContours() 函数进行轮廓检测,获取所有的白框轮廓。
3. 对每个白框轮廓使用 minAreaRect() 函数获取最小外接矩形框的角点坐标。
4. 将所有白框的角点坐标保存下来,即可得到所有白框的角点坐标列表。
示例代码如下:
```
from PIL import Image
import cv2
# 加载图像
img = Image.open('image.png').convert('L')
# 转为二值图像
img_bin = img.point(lambda x: 255 if x > 128 else 0)
# 转为 OpenCV 格式
img_cv2 = cv2.cvtColor(np.array(img_bin), cv2.COLOR_GRAY2RGB)
# 进行轮廓检测
contours, hierarchy = cv2.findContours(img_cv2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 获取每个白框的角点坐标
boxes = []
for cnt in contours:
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
boxes.append(box)
# 显示图像和所有白框
img_draw = Image.fromarray(cv2.cvtColor(img_cv2, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(img_draw)
for box in boxes:
draw.polygon([tuple(p) for p in box], outline='red')
img_draw.show()
# 输出所有白框的角点坐标
for i, box in enumerate(boxes):
print(f'Box {i + 1}: {box}')
```
阅读全文