一.引言
目前有很多常见的图像处理库,比如cv2,pillow等,OpenCV(Open Source Computer Vision Library)是一个跨平台的计算机视觉库,专门用于处理图像和视频。它提供了丰富的功能,广泛应用于实时图像处理、计算机视觉、机器学习和深度学习等领域。Pillow是Python Imaging Library (PIL)的一个分支,是Python中最常用的图像处理库之一。它功能简单易用,特别适合处理图像文件的读取、保存、转换和一些常见的图像编辑任务。
二.读取图片
cv2
img = cv2.imdecode(np.fromfile(image_path, dtype=np.uint8), 1)
pilow
img = Image.open('image.jpg')
还有一种不常见的,如果上面两种读不出来的图片有
import cv2
import imageio.v2 as imageio
import numpy as np
from PIL import Image, ImageFile
from tkinter.filedialog import askdirectory
ImageFile.LOAD_TRUNCATED_IMAGES = True
# 尝试解码图片
image = imageio.imread(out_mada_path)
img_1 = np.array(image)
# img = img[:, :, ::-1] # 将BGR转为RGB
img = cv2.cvtColor(img_1, cv2.COLOR_RGB2BGR)
三.给图片上mask和效果图,背景颜色不变
groups = [obj['group'] for obj in js['objects'] if obj['label'] != 'background']
groups = sorted(list(set(groups)), key=lambda x: int(x))
group_index_dict = {group: index+1 for index, group in enumerate(groups)}
for group, index in group_index_dict.items():
mask_label1 = np.zeros((h, w), np.uint8)
mask_label2 = np.zeros((h, w), np.uint8)
mask_all = np.zeros((h, w, 3), np.uint8)
for obj in js['objects']:
pts = np.array(obj['polygon'], np.int32)
if group == obj['group']:
if obj['label'] == '1':
cv2.fillPoly(mask_label1, [pts], color=255)
cv2.fillPoly(mask_label2, [pts], color=0)
cv2.fillPoly(mask_all, [pts], color=(0, 0, 255))
elif obj['label'] == '2':
cv2.fillPoly(mask_label1, [pts], color=0)
cv2.fillPoly(mask_label2, [pts], color=255)
cv2.fillPoly(mask_all, [pts], color=(255, 0, 0))
else:
cv2.fillPoly(mask_label1, [pts], color=0)
cv2.fillPoly(mask_label2, [pts], color=0)
cv2.fillPoly(mask_all, [pts], color=(0, 0, 0))
else:
cv2.fillPoly(mask_label1, [pts], color=0)
cv2.fillPoly(mask_label2, [pts], color=0)
cv2.fillPoly(mask_all, [pts], color=(0, 0, 0))
四.读取json信息绘制对应效果图
画框的函数
cv2.rectangle(img, (round(x0), round(y0)), (round(w), round(h)), color=(0, 255, 0), thickness=2)
给框上面写字
# 在矩形框上方绘制文本 "cat"
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 0.5
font_thickness = 2
font_color = (0, 0, 255)
text = "Cat"
text_size = cv2.getTextSize(text, font, font_scale, font_thickness)[0]
text_x = round(x0)
text_y = round(y0) - 5
if text_y < 0:
text_y = round(y0) + text_size[1] + 5
cv2.putText(img, text, (text_x, text_y), font, font_scale, font_color, font_thickness)
绘制关键点
if shape_type == 'point':
select_point_index = obj_shape.get('shape_attribute', {}).get('selectPointIndex')
# 存储每个点的信息
for point in shape:
keypoints.extend([point.get('x', 0), point.get('y', 0)])
x = point.get('x', 0)
y = point.get('y', 0)
keypoints_info.append((x, y, select_point_index)) # 存储坐标和索引
visibility = 1 if obj_shape.get('shape_attribute', {}).get('pointAttrName') == '可见' else 2
visible.append(visibility)
# 绘制关键点和显示 `select_point_index`
for i, (x, y, select_point_index) in enumerate(keypoints_info):
color_points = (0, 255, 0) if visible[i] == 1 else (0, 255, 255)
cv2.circle(img, (int(x), int(y)), 5, color_points, -1) # 绘制点
cv2.putText(img, str(select_point_index), (int(x), int(y) - 10), cv2.FONT_HERSHEY_SIMPLEX,
font_scale,
font_color, thickness) # 显示正确的 `select_point_index`