裁剪固定尺寸图片

主要是将大图裁剪成固定尺寸,并转化VOC中的xml格式,要点如下:

  1. 尺寸不够四舍五入成一张图。(可分为4部分,左上部分固定尺寸,最后一列,最后一行,以及剩余右下角部分)
  2. 若目标在边缘,自适应扩大图像尺寸
    代码如下:
import cv2
import os
import json
import numpy as np
from xml.dom.minidom import Document
IMG_SIZE = 640
LABEL_WIDTH = 30# 主要裁剪逻辑
def crop_image(data_type = "val"):img_path = "xxx\\"+data_type+"\images\\"json_path = "xxx\\"+data_type+"\labels\\"txt_path = "xxx\VOCdevkit\VOC2007\ImageSets\Main\\"txt_file = open(txt_path + data_type + ".txt", "w")img_save_path = "xxx\VOCdevkit\VOC2007\JPEGImages\\"anno_path = "xxxx\VOCdevkit\VOC2007\Annotations\\"for file in os.listdir(img_path):if file.__contains__("png"):json_name = json_path + file[0:-4] + ".json"all_points = get_json_points(json_name)img = cv2.imread(img_path+file)h, w, _ = img.shapeprint(img.shape, round(h/IMG_SIZE),round(w/IMG_SIZE))index = 0row = round(h/IMG_SIZE)col = round(w/IMG_SIZE)# 完整的640*640for i in range(row-1):for j in range(col-1):index = index + 1cur_img_points, rect = get_crop_img_points(j * IMG_SIZE, i * IMG_SIZE, (j + 1) * IMG_SIZE,(i + 1) * IMG_SIZE, all_points)patch_image = img[rect[1]:rect[3],rect[0]:rect[2],:]file_name = file[:-4] + "_crop_" + str(index)json_points_to_xml(cur_img_points, rect[2] - rect[0], rect[3] - rect[1], anno_path, file_name)cv2.imwrite(img_save_path + file_name +".png", patch_image)txt_file.write(file_name + "\n")# 最后一列for i in range(row - 1):index = index + 1cur_img_points, rect = get_crop_img_points((col-1) * IMG_SIZE, i * IMG_SIZE, w,(i + 1) * IMG_SIZE, all_points)patch_image = img[rect[1]:rect[3], rect[0]:rect[2], :]file_name = file[:-4] + "_crop_" + str(index)json_points_to_xml(cur_img_points, rect[2] - rect[0], rect[3] - rect[1], anno_path, file_name)cv2.imwrite(img_save_path + "" + file[:-4] + "_crop_" + str(index) + ".png", patch_image)txt_file.write(file_name + "\n")# 最后一行for j in range(col - 1):index = index + 1cur_img_points, rect = get_crop_img_points(j * IMG_SIZE, (row-1) * IMG_SIZE, (j + 1) * IMG_SIZE,h, all_points)patch_image = img[rect[1]:rect[3], rect[0]:rect[2], :]file_name = file[:-4] + "_crop_" + str(index)json_points_to_xml(cur_img_points, rect[2] - rect[0], rect[3] - rect[1], anno_path, file_name)cv2.imwrite(img_save_path + "" + file[:-4] + "_crop_" + str(index) + ".png", patch_image)txt_file.write(file_name + "\n")# 右下角最后一块index = index + 1cur_img_points, rect = get_crop_img_points((col-1) * IMG_SIZE, (row - 1) * IMG_SIZE, w, h, all_points)patch_image = img[rect[1]:rect[3], rect[0]:rect[2], :]file_name = file[:-4] + "_crop_" + str(index)json_points_to_xml(cur_img_points, rect[2] - rect[0], rect[3] - rect[1], anno_path, file_name)cv2.imwrite(img_save_path + "" + file[:-4] + "_crop_" + str(index) + ".png", patch_image)txt_file.write(file_name + "\n")# 获取大图像的所有目标中心点
def get_json_points(file_name):file = open(file_name)json_file = json.load(file)points = json_file["shapes"]all_points = []for one_point_label in points:# print(one_point_label)all_points.append(one_point_label["points"][0])print(len(all_points),all_points)return all_points# 获取裁剪小图的目标中心点,并返回自适应的图像左上顶点,以及右下顶点
def get_crop_img_points(left_top_x,left_top_y,right_bottom_x,right_bottom_y,points):cur_img_points = []for point in points:x = point[0]y = point[1]if left_top_x <= x < right_bottom_x and left_top_y <= y < right_bottom_y:cur_img_points.append([x, y])cur_img_points = np.asarray(cur_img_points)if cur_img_points.shape[0] > 0:[min_x, min_y] = np.amin(cur_img_points, axis=0)[max_x, max_y] = np.amax(cur_img_points, axis=0)else:return cur_img_points, [int(left_top_x),int(left_top_y),int(right_bottom_x),int(right_bottom_y)]offset = 2if min_x - LABEL_WIDTH / 2 < left_top_x:left_top_x = min_x - LABEL_WIDTH / 2 - offsetif min_y - LABEL_WIDTH / 2 < left_top_y:left_top_y = min_y - LABEL_WIDTH / 2 - offsetif max_x + LABEL_WIDTH / 2 > right_bottom_x:right_bottom_x = max_x + LABEL_WIDTH / 2 + offsetif max_y + LABEL_WIDTH / 2 > right_bottom_y:right_bottom_y = max_y + LABEL_WIDTH / 2 + offsetcur_img_points = cur_img_points - [left_top_x,left_top_y]return cur_img_points, [int(left_top_x),int(left_top_y),int(right_bottom_x),int(right_bottom_y)]# 转化为VOC中XML格式数据
def json_points_to_xml(points,width,height,annotations_path, file):xml_file = annotations_path + file + ".xml"doc = Document()annotation = doc.createElement("annotation")doc.appendChild(annotation)folder = doc.createElement("folder")folder_text = doc.createTextNode("VOC2007")folder.appendChild(folder_text)filename = doc.createElement("filename")filename_text = doc.createTextNode(file + ".png")filename.appendChild(filename_text)size = doc.createElement("size")annotation.appendChild(folder)annotation.appendChild(filename)annotation.appendChild(size)size_w = doc.createElement("width")size.appendChild(size_w)size_w_text = doc.createTextNode(str(width))size_w.appendChild(size_w_text)size_h = doc.createElement("height")size.appendChild(size_h)size_h_text = doc.createTextNode(str(height))size_h.appendChild(size_h_text)depth = doc.createElement("depth")size.appendChild(depth)depth_text = doc.createTextNode("1")depth.appendChild(depth_text)for center in points:one_object = doc.createElement("object")annotation.appendChild(one_object)object_name = doc.createElement("name")object_name_text = doc.createTextNode("lgd")object_name.appendChild(object_name_text)one_object.appendChild(object_name)pose = doc.createElement("pose")pose.appendChild(doc.createTextNode("center"))truncated = doc.createElement("truncated")truncated.appendChild(doc.createTextNode("0"))difficult = doc.createElement("difficult")difficult.appendChild(doc.createTextNode("0"))one_object.appendChild(pose)one_object.appendChild(truncated)one_object.appendChild(difficult)bndbox = doc.createElement("bndbox")xmin = doc.createElement("xmin")ymin = doc.createElement("ymin")xmax = doc.createElement("xmax")ymax = doc.createElement("ymax")one_object.appendChild(bndbox)bndbox.appendChild(xmin)bndbox.appendChild(ymin)bndbox.appendChild(xmax)bndbox.appendChild(ymax)radius = LABEL_WIDTH / 2x1 = center[0] - radiusy1 = center[1] - radiusx2 = center[0] + radiusy2 = center[1] + radiusxmin.appendChild(doc.createTextNode(str(x1)))ymin.appendChild(doc.createTextNode(str(y1)))xmax.appendChild(doc.createTextNode(str(x2)))ymax.appendChild(doc.createTextNode(str(y2)))f = open(xml_file, 'w')f.write(doc.toprettyxml(indent='\t'))f.close()crop_image()

验证显示

代码如下:

import os
import json
import cv2
from xml.dom.minidom import Document
import xml.etree.cElementTree as ETdef draw_img_by_xml():img_path = "xxx\VOCdevkit\VOC2007\JPEGImages\\"xml_path = "xxx\VOCdevkit\VOC2007\Annotations\\"for img_name in os.listdir(img_path):print(img_name)img = cv2.imread(img_path+img_name)xml_dir_name = xml_path + img_name[0:-4] + ".xml"tree = ET.parse(xml_dir_name)root = tree.getroot()for object in root.findall('object'):bndbox = object.find('bndbox')xmin = int(float(bndbox.find('xmin').text))ymin = int(float(bndbox.find('ymin').text))xmax = int(float(bndbox.find('xmax').text))ymax = int(float(bndbox.find('ymax').text))print(xmin,ymin,xmax,ymax)cv2.rectangle(img, (xmin,ymin), (xmax,ymax), (255, 0, 0), 2)cv2.imshow(img_name, img)cv2.waitKey(0)

将目标检测大尺寸图片裁剪成固定尺寸图片相关推荐

  1. ios 将矩形图片裁剪成圆形图片

    在ios中将一个正方形的图片裁剪成圆形的图片是一件非常容易的事情, 直接设置 imageView.layer.cornerRadius 这个属性, 再设置 imageView.clipsToBound ...

  2. python 识别图片中的人脸,并裁剪人脸,将图片转化成固定大小,并将图片再按照自己的后缀名存储起来

    下列代码,识别图片中的人脸,并裁剪人脸,将图片转化成固定大小,再按照自己的后缀名存储起来 bug:我是用来识别单张图片中只有一个人脸的数据集,如果用来处理一张图片中的多个人脸,那么图片的命名可能会有b ...

  3. 如何把一个图片裁剪成圆形

    1.有的时候,为了工作的需要,需要吧图片裁剪成圆形.我们一般有两种思路:让承载image的ImageView变成圆形,或者把图片变成圆形. A:通过image的mask 来操作.需要添加mask目标图 ...

  4. 地图裁剪器,可以将图片裁剪成瓦片数据,主要用途是将高清卫星图像裁剪成瓦片图,可以做离线地图的开发,基于墨卡托坐标

    废话不多说,直接上代码 地图裁剪器,可以将图片裁剪成瓦片数据,主要用途是将高清卫星图像裁剪成瓦片图,可以做离线地图的开发,基于墨卡托坐标 地图裁剪 package com.wwp.utils.map; ...

  5. python 将图片切割成固定大小的图片脚本

    将像素很大的图片切割成固定大小的多张图片,代码如下: import numpy as np import matplotlib import os from PIL import Imagedef i ...

  6. 怎么将图片裁剪成想要的尺寸啊?教你三个图片裁剪怎么弄的方法

    在日常生活工作中,我们有时候会需要将图片上传到各种平台上.因为有一些平台对于图片的尺寸大小有一定的限制要求,所以为了能成功上传图片,我们需要对图片的大小裁剪成合适的尺寸.那小伙伴们知道怎么将图片裁剪成 ...

  7. python将图片裁剪成九宫格

    要求:将图片裁剪成九宫格,宫格图片位置打乱 思路: 判断该图片长宽是否能被3整除,不能需要对图片进行裁剪(我的是边角裁剪) 双重for循环,根据步长对图片数组进行切片达到裁剪效果 random.shu ...

  8. Python 把图片拆分成宫格图片组

    文章目录 Python 把图片拆分成宫格图片组 Python 把图片拆分成宫格图片组 import os from PIL import Image# 所需安装的模块 # pip install pi ...

  9. Android中将一个图片切割成多个图片[转]

    有种场景,我们想将一个图片切割成多个图片.比如我们在开发一个拼图的游戏,就首先要对图片进行切割. 以下是封装好的两个类,可以实现图片的切割.仅供参考和学习. 一个是ImagePiece类,此类保存了一 ...

最新文章

  1. Async和Await如何简化异步编程几个实例
  2. python3循环遍历嵌套字典替换指定值
  3. jvm系列(四):jvm调优-命令篇
  4. 检测Java Web应用程序而无需修改其源代码
  5. 随机排列实现 -shuffle算法
  6. python_day12_html
  7. vue-router组件重用 路由切换时的问题
  8. [译]CSS3实现柱状图的3D立体动画效果
  9. AI产品开发的核心原则:以研究为核心驱动
  10. YOLO3实现对自身数据集的训练-YOLO3代码学习资料
  11. pgsql 9.4修改数据库只读
  12. Agent建模之Repast建模编程介绍
  13. JavaScript—— 常见网页特效
  14. 如何划分和细化有限元网格,才能提高计算的精度和速度?
  15. 上海市青少年算法2022年6月月赛(丙组)
  16. 万王之王显示服务器尚未对外开放,《万王之王3》公测5月26日火爆开启 姚星彤性感代言...
  17. H5页面调用微信支付
  18. springboot整合Redis+elasticsearch时的异常问题
  19. 30套最实用JAVA学习视频教程合集
  20. 线性表顺序存储的一些操作(初始化,添加,删除)

热门文章

  1. 今天聊聊数据湖和“三剑客”,吐槽一下数据湖被夸大的增量功能
  2. c++ templete
  3. sql 筛选不为NULL且不为空
  4. 嵌入式如何与AI相结合,什么是端侧AI~
  5. 嵌入式AI应用开发对操作系统的要求与挑战[转]
  6. 疫情期间去澳洲的注意事项、签证持有者的限制信息
  7. “三峡大坝能防万年一遇的洪水”,”中国反应堆厂房抗万年一遇地震“?
  8. 编辑写三个jsp页面,include动作标记的用法
  9. 微信支付 CertificateDownloader 证书下载
  10. 考研英语一阅读真题逐词翻译(2010-2023)共211页