结果:
代码:
import os
from PIL import Image
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
from matplotlib import ticker
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# txt文件夹路径
txts_path = "自己的路径"
# 图片文件夹路径
jpgs_path = "自己的路径"
# 存储w/h比例的列表
ratios = []
# 遍历文件夹中的每个txt文件
for txt_file in os.listdir(txts_path):
if txt_file.endswith(".txt"):
txt_path = os.path.join(txts_path, txt_file)
txtname = os.path.basename(txt_path)
jpgname = txtname.replace(".txt", ".jpg")
jpg_path = os.path.join(jpgs_path, jpgname)
image = Image.open(jpg_path)
width, height = image.size
with open(txt_path, "r") as file:
lines = file.readlines()
for line in lines:
category, x, y, w, h = line.strip().split(" ")
w = float(w)
h = float(h)
aw = w * width
ah = h * height
if ah > 0:
ratio = aw / ah
ratios.append(ratio)
# 生成直方图
plt.figure(figsize=(8, 5), dpi=80)
n, bins, patches = plt.hist(ratios, bins=10, rwidth=0.8, align='left')
# 打标签,在合适的位置标注每个直方图上面样本数
for i in range(len(n)):
plt.text(bins[i], n[i]*1.02, int(n[i]), fontsize=12, horizontalalignment="center")
plt.ylim(0, 570)
# plt.legend()
plt.xlabel("Ratio (aw/ah)")
plt.ylabel("Frequency")
plt.title("标注框长宽比直方图")
plt.savefig('直方图'+'.png')
plt.show()
print('finish!')