1.背景介绍
对于计算机视觉领域,图像标注是一个非常重要的任务。标注可以为图像分类、目标检测、语义分割、边界框绘制等任务提供必要的信息。本文将介绍如何使用Python对图像进行形状标注。
2.准备工作
2.1 安装必要的库
在使用Python进行图像标注之前,需要安装一些必要的库。这里我们使用Python的图片处理库-OpenCV和Numpy。
!pip install opencv-python-headless
!pip install numpy
2.2 下载示例图片
我们使用一张示例图片来进行标注。您可以使用自己的图片或者使用以下命令下载本文使用的示例图片。
!wget https://cdn.pixabay.com/photo/2021/08/28/23/45/beach-6588879_960_720.jpg -O beach.jpg
3.标注形状
为了使用Python对图片进行标注,我们需要使用鼠标来选取形状的坐标。首先,我们需要定义一个回调函数来处理每次鼠标点击事件。
import cv2
import numpy as np
drawing = False
mode = True
ix, iy = -1, -1
def draw_shape(event, x, y, flags, param):
global ix, iy, drawing, mode
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 1)
else:
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 1)
else:
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
img = cv2.imread('beach.jpg')
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_shape)
while True:
cv2.imshow('image', img)
k = cv2.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv2.destroyAllWindows()
上述代码定义了一个回调函数`draw_shape`,该函数将在每次鼠标事件发生时执行。使用左键点击并拖动鼠标时,将在图像上绘制矩形或圆形来标记形状的坐标。
使用上述代码执行后,将在新的窗口打开示例图片,并使用鼠标标注形状。
当鼠标拖动时,将在图像上绘制矩形或圆形。
拖动指针并释放鼠标,将在图像上绘制所选形状。
4.保存标注结果
完成标注后,我们需要将结果保存到文件中以备后续使用。我们在上一步鼠标事件中添加了绘制矩形或圆形的代码。因此,我们可以使用已经绘制的矩形坐标或圆形中心作为标注结果。
shape = []
def draw_shape(event, x, y, flags, param):
global ix, iy, drawing, mode, shape
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 1)
else:
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 1)
shape.append([ix, iy, x, y])
else:
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
shape.append([x, y])
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_shape)
while True:
cv2.imshow('image', img)
k = cv2.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv2.destroyAllWindows()
np.savetxt('shapes.csv', shape)
上述代码首先定义了一个`shape`列表,用来存储标注结果。当结束鼠标操作时,将已经绘制过的矩形坐标或圆形中心坐标存储到`shape`列表中。最后调用`numpy`库的函数`np.savetxt()`将标注结果保存到CSV文件中,以便后续使用。
5.绘制已有标注
在某些情况下,我们需要为已经标注好形状的图像绘制形状。我们可以使用OpenCV的绘图功能,根据保存在文件中的标注结果来绘制形状。
img = cv2.imread('beach.jpg')
shape = np.genfromtxt('shapes.csv', delimiter=',')
for s in shape:
if len(s) == 4:
cv2.rectangle(img, (int(s[0]), int(s[1])), (int(s[2]), int(s[3])), (0, 255, 0), 1)
else:
cv2.circle(img, (int(s[0]), int(s[1])), 5, (0, 0, 255), -1)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
上述代码首先调用`numpy`库的函数`np.genfromtxt()`读取保存在文件中的标注结果。接着,我们使用OpenCV的函数`cv2.rectangle()`和`cv2.circle()`根据保存的结果来绘制形状。最后,我们将绘制后的图像显示在屏幕上。
总结
在本文中,我们介绍了如何使用Python对图像进行形状标注。我们使用OpenCV和Numpy库来处理图像和标注结果,并且使用鼠标来选取形状的坐标。最后,我们将标注结果保存到文件中,并且演示了如何绘制已有标注。