如何使用Python对图片进行形状标记

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库来处理图像和标注结果,并且使用鼠标来选取形状的坐标。最后,我们将标注结果保存到文件中,并且演示了如何绘制已有标注。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签