【matplotlib】可视化之路——Rectangle类详解

概述

Rectangle 类官方文档,以下是 maplotlib 库中的继承图:

在这里插入图片描述

由图可知 Rectangle 类继承自 Patch 类,关于 Patch 类,详情见 【matplotlib】可视化之路——Patch类详解。以下是官方文档的说明:

A rectangle defined via an anchor point xy and its width and height.The rectangle extends from xy[0] to xy[0] + width in x-direction and from xy[1] to xy[1] + height in y-direction.

如果说 Patch 类是一个带有颜色块,那么 Rectangle 类就是根据锚点、宽度和高度确定一个可绘制的矩形块(这个相比于Patch就是质的飞跃,因为Rectangle类具有了形态)。锚点是包含两个浮点型的元祖,高度和宽度是两个浮点型。示例如下:

                +------------------+
                |                  |
              height               |
                |                  |
               (xy)---- width -----+

Rectangle 类定义如下:

class Rectangle(Patch):
	def __init__(self, xy, width, height, angle=0.0, **kwargs):

参数说明:

  • 参数 1:xy:浮点型,指定矩形左下角;
  • 参数 2:width:浮点型,指定举行的宽度;
  • 参数 3:height:浮点型,指定矩形高度;
  • 参数 4:angle:浮点型,指定矩形绕 xy 点逆时针旋转的度数;
  • 参数 5:kwargs:指定 Patch 父类属性;

参数详解

Xy

xy 指定锚点坐标,在一般情况下可以把 xy 想象成左下角,但 xy 是哪个角实际上取决于坐标轴的方向以及宽度和高度的符号。例如,如果 x 轴倒置或宽度为负,xy 将是右下角。示例程序如下:

 fig, ax = plt.subplots(2, 2)

test_Rectangle00 = plt.Rectangle((6, 6), 2, 2, 0)	#左下角(6, 6), w=2, h=2
test_Rectangle01 = plt.Rectangle((6, 6), 2, -2, 0)	#左上角(6, 6), w=2, h=-2

test_Rectangle10 = plt.Rectangle((6, 6), -2, -2, 0)	#右上角(6, 6), w=-2, h=-2
test_Rectangle11 = plt.Rectangle((6, 6), -2, 2, 0)	#右下角(6, 6), w=-2, h=2

#添加矩形
ax[0][0].add_patch(test_Rectangle00)
ax[0][0].set_title('左下角(6, 6), w=2, h=2')

#添加矩形
ax[0][1].add_patch(test_Rectangle01)
ax[0][1].set_title('左上角(6, 6), w=2, h=-2')

#添加矩形
ax[1][0].add_patch(test_Rectangle10)
ax[1][0].set_title('右上角(6, 6), w=-2, h=-2')

#添加矩形
ax[1][1].add_patch(test_Rectangle11)
ax[1][1].set_title('右下角(6, 6), w=-2, h=2')

#添加锚点和设置基础属性
for i in range(2):
    for j in range(2):
        ax[i][j].plot(6, 6, markersize=6, marker='o', markerfacecolor='#FF0000', linewidth=0)
        ax[i][j].grid(True)
        ax[i][j].set(**prop_normal)
        ax[i][j].text(6, 6, '锚点')

plt.show()

画图结果如下:

在这里插入图片描述

Angle

angle 指定旋转尺度,千万注意这里指的是如果旋转度数是正数将会逆时针旋转,负数才是顺时针旋转。示例程序如下:

 fig, ax = plt.subplots()

angle = 0
color_list = ['#FF0000', '#00FF00', '#0000FF', '#FFFF00', '#FF00FF', '#00FFFF', '#10c020', '#d20F99']

for i in range(8):
    test_Rectangle = plt.Rectangle((6, 6), 0.1, 2, angle, facecolor=color_list[i], label=str(angle) + '度')
    ax.add_patch(test_Rectangle)
    angle += 45

ax.plot(6, 6, markersize=6, marker='o', markerfacecolor='#000000', linewidth=0)
plt.text(6, 6, '锚点')

plt.title('逆时针旋转')
plt.xlim([0, 10])
plt.ylim([0, 10])
plt.grid(True)
plt.legend()
plt.show()

画图结果如下:

在这里插入图片描述

文中难免会出现一些描述不当之处(尽管我已反复检查多次),欢迎在留言区指正,相关的知识点也可进行分享,希望大家都能有所收获!!如果觉得我的文章写得还行,不妨支持一下。你的每一个转发、关注、点赞、评论都是对我最大的支持!

<think>嗯,用户想了解如何对COCO数据集的图片进行可视化处理,或者查看已有的可视化结果。我需要先回顾一下COCO数据集的结构和常用工具。记得COCO提供了官方的API,也就是pycocotools,这个库应该可以用来加载标注数据并进行可视化。 首先,用户可能需要安装这个库,所以应该提到安装步骤,比如使用pip安装pycocotools。然后,数据集的目录结构也很重要,用户需要知道图像和标注文件的存放位置。比如,图像通常放在train2017、val2017这样的文件夹里,而标注文件是json格式的,比如instances_train2017.json。 接下来,具体的代码示例是关键。可能需要使用torchvision中的CocoDetection来加载数据集,这样可以直接获取图像和标注。然后,利用pycocotools的API来显示标注信息。例如,用COCO加载标注文件,然后获取图像ID,提取标注和分割信息。 另外,可视化部分可能需要用到matplotlib来显示图像,然后绘制边界框和标签。对于实例分割,可能还需要处理多边形或RLE编码的分割掩码。这里需要确保代码示例正确,比如正确设置路径,处理不同别的颜色,以及正确解析标注信息。 用户可能还会关心如何查看已有的可视化结果,比如使用现有的工具或库,或者参考一些在线资源。比如引用中提到的COCODetection和相关的博客文章,这些都可以作为参考资料。 还需要注意常见问题,比如路径错误、标注数据加载失败,或者图像和标注不匹配的情况。建议用户检查路径是否正确,标注文件是否完整,以及依赖库是否安装正确。 可能还需要比较不同的可视化方法,比如使用torchvision内置的方法和pycocotools的方法有何不同。或者提到其他工具,比如COCO官方提供的在线查看工具,方便用户快速浏览数据集。 最后,生成相关问题可以帮助用户深入了解更多内容,比如处理其他任务如关键点检测的可视化,或者与其他数据集如Open Images的比较,以及如何自定义可视化样式。</think>### COCO数据集图片可视化方法及示例 #### 一、基础工具准备 1. **安装依赖库** ```bash pip install pycocotools matplotlib torch torchvision ``` 2. **数据集目录结构** ``` coco/ ├── annotations/ # 存放标注文件 │ ├── instances_train2017.json │ └── instances_val2017.json ├── train2017/ # 训练集图片 └── val2017/ # 验证集图片 ``` #### 二、可视化方法详解 1. **使用PyTorch的CocoDetection** ```python from torchvision.datasets import CocoDetection import matplotlib.pyplot as plt # 加载数据集 dataset = CocoDetection( root='coco/val2017', annFile='coco/annotations/instances_val2017.json' ) # 可视化第一张图片及其标注 image, targets = dataset[0] plt.imshow(image) for target in targets: bbox = target['bbox'] # [x,y,width,height] category_id = target['category_id'] plt.gca().add_patch(plt.Rectangle( (bbox[0], bbox[1]), bbox[2], bbox[3], fill=False, edgecolor='red', linewidth=2 )) plt.text(bbox[0], bbox[1], f'Class {category_id}', color='white', backgroundcolor='red') plt.axis('off') plt.show() ``` 2. **通过pycocotools API实现** ```python from pycocotools.coco import COCO import cv2 coco = COCO('coco/annotations/instances_val2017.json') image_ids = coco.getImgIds()[:5] # 取前5张图片 for img_id in image_ids: image_info = coco.loadImgs(img_id)[0] image_path = f'coco/val2017/{image_info["file_name"]}' image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) ann_ids = coco.getAnnIds(imgIds=img_id) annotations = coco.loadAnns(ann_ids) for ann in annotations: x, y, w, h = ann['bbox'] cv2.rectangle(image, (int(x), int(y)), (int(x+w), int(y+h)), (255,0,0), 2) if 'segmentation' in ann: # 绘制实例分割 for seg in ann['segmentation']: poly = np.array(seg).reshape((-1,2)).astype(np.int32) cv2.polylines(image, [poly], True, (0,255,0), 2) plt.imshow(image) plt.show() ``` #### 三、关键点可视化(需关键点标注) ```python # 加载关键点标注 coco_kps = COCO('coco/annotations/person_keypoints_val2017.json') # 特殊处理关键点连接关系 skeleton = [[16,14],[14,12],[17,15],[15,13],[12,13],[6,12],[7,13],[6,7], [6,8],[7,9],[8,10],[9,11],[2,3],[1,2],[1,3],[2,4],[3,5],[4,6],[5,7]] # 绘制关键点连线 for ann in annotations: if 'keypoints' in ann: kps = np.array(ann['keypoints']).reshape(-1,3) for i, (x,y,v) in enumerate(kps): if v > 0: # 可见关键点 plt.scatter(x, y, color='cyan') for (s,e) in skeleton: if kps[s-1][2]>0 and kps[e-1][2]>0: plt.plot([kps[s-1][0],kps[e-1][0]], [kps[s-1][1],kps[e-1][1]], c='yellow') ``` #### 四、可视化效果增强技巧 1. **别颜色映射**:使用`plt.cm.get_cmap('tab20')`生成不同颜色 2. **透明度控制**:在`add_patch`中设置`alpha=0.3` 3. **掩码叠加显示**:对分割标注使用`plt.contour`绘制轮廓 #### 五、常见问题排查 1. **路径错误**:确保图片路径包含完整的2017子目录 2. **标注加载失败**:检查JSON文件版本与代码兼容性 3. **显示空白**:确认Matplotlib后端配置正确 #### 六、已有可视化工具推荐 1. **在线查看器**:访问[cocoexplorer.ortx.ai](https://cocoexplorer.ortx.ai) 2. **标注对比工具**:使用`labelme`对比原始图片与标注
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猪猪家的大猪猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值