怎么用pillow库的getbbox()获取角点坐标
时间: 2023-03-20 22:01:00 浏览: 76
使用Pillow库的getbbox()函数可以获取图像中的包围盒(bounding box),也就是最小矩形框。这个框可以完全覆盖图像中所有非零像素的部分,并返回四个角点的坐标,即左上角和右下角的坐标。
下面是一个使用Pillow库的getbbox()函数获取角点坐标的示例代码:
```python
from PIL import Image
# 打开图片
img = Image.open('image.png')
# 获取包围盒
bbox = img.getbbox()
# 输出包围盒的四个角点坐标
print('左上角坐标:', (bbox[0], bbox[1]))
print('右上角坐标:', (bbox[2], bbox[1]))
print('左下角坐标:', (bbox[0], bbox[3]))
print('右下角坐标:', (bbox[2], bbox[3]))
```
注意,getbbox()函数只能处理二值图像(即只有黑白两色的图像),对于灰度图像或彩色图像,需要先进行二值化处理才能正确获取包围盒。
相关问题
一张图有多个白框,怎么用pillow库的getbbox()获取所有框的角点坐标
Pillow库中的getbbox()函数是用来获取图像中所有非零区域的边界框的,如果一个图像中有多个白框,可以通过以下步骤获取每个白框的角点坐标:
1. 首先使用Pillow库中的Image.open()函数打开图像文件,然后使用Image.convert()函数将图像转换为灰度图像。
2. 接着使用ImageOps.invert()函数对图像进行反转处理,将白色背景转换为黑色背景,将白框变成了白色的图形。
3. 使用ImageOps.autocontrast()函数对图像进行自动对比度调整,让图像中的白框更加明显。
4. 使用ImageChops.subtract()函数对反转后的图像和自动对比度调整后的图像进行差值计算,得到一个只有白框的图像。
5. 使用ImageOps.invert()函数再次反转图像,使白框变回白色。
6. 最后,使用ImageOps.invert(ImageOps.autocontrast(ImageOps.invert(ImageOps.subtract(image_gray, image_diff))))这一串函数链得到只有白框的图像,然后使用getbbox()函数获取每个白框的角点坐标。
需要注意的是,如果图像中有多个连通的白框,getbbox()函数只会返回最外层白框的角点坐标,内部白框的角点坐标需要使用其他函数进行计算。
一张黑白灰度图里有多个白框,怎么用pillow库的getbbox()获取所有框的角点坐标
使用 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}')
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)