如何将处理后的numpy图像数组存入Python字典并在Jupyter中展示?
问题描述
我在Python中创建了一个空字典,循环读取并处理图像,处理后的结果是numpy数组。希望把这些numpy数组添加到字典中,以顺序整数作为键、数组作为值存储,最终要把处理后的图像放到imagegrid里在Jupyter Notebook展示,已有针对字典中图像的展示代码,想知道怎么实现,有没有更简便的方式?
原始代码:
stopsign_classifier = cv2.CascadeClassifier('haarcascade_stopsigns.xml') img_dict = {} folder = "D:\\temp\\" for imagesdir in os.listdir(folder): imgName = imagesdir img = cv2.imread(folder + imgName) signs = stopsign_classifier.detectMultiScale(img, scaleFactor= 1.01, minNeighbors = 9) #检查照片中是否存在停车标识 if signs is (): print("No stop signs found") # 根据停车标识分类器的返回信息,在识别出的停车标识周围绘制框 else: for (x, y, w, h) in signs: cv2.rectangle(img, (x,y), (x+w,y+h), (255, 255 , 255), 8) # 在此处添加将img存入字典的代码
解决方案
一、按需求存入字典的实现
要实现顺序整数作为键,直接利用字典当前的长度作为下一个键即可(初始空字典长度为0,第一个键就是0,每添加一个元素长度加1,正好对应顺序整数)。在注释位置添加以下代码:
# 将处理后的图像存入字典,键为当前字典长度(顺序整数) img_dict[len(img_dict)] = img
修改后的完整代码:
import os import cv2 stopsign_classifier = cv2.CascadeClassifier('haarcascade_stopsigns.xml') img_dict = {} folder = "D:\\temp\\" for imagesdir in os.listdir(folder): imgName = imagesdir img = cv2.imread(folder + imgName) signs = stopsign_classifier.detectMultiScale(img, scaleFactor= 1.01, minNeighbors = 9) #检查照片中是否存在停车标识 if signs is (): print("No stop signs found") else: # 根据停车标识分类器的返回信息,在识别出的停车标识周围绘制框 for (x, y, w, h) in signs: cv2.rectangle(img, (x,y), (x+w,y+h), (255, 255 , 255), 8) # 将处理后的图像存入字典,键为顺序整数 img_dict[len(img_dict)] = img
注意:cv2.imread读取的图像是BGR格式,若你的展示代码未处理格式转换,需添加img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)适配Jupyter的RGB展示逻辑。
二、更简便的实现方式:用列表替代字典
因为顺序整数键和列表的索引完全对应,用列表存储会更高效、操作更简单,后续展示时也能通过索引直接访问,完全可以替代字典的作用:
- 初始化空列表:
img_list = [] - 循环中添加图像:
img_list.append(img)
修改后的完整代码:
import os import cv2 stopsign_classifier = cv2.CascadeClassifier('haarcascade_stopsigns.xml') img_list = [] # 用列表替代字典 folder = "D:\\temp\\" for imagesdir in os.listdir(folder): imgName = imagesdir img = cv2.imread(folder + imgName) signs = stopsign_classifier.detectMultiScale(img, scaleFactor= 1.01, minNeighbors = 9) #检查照片中是否存在停车标识 if signs is (): print("No stop signs found") else: # 根据停车标识分类器的返回信息,在识别出的停车标识周围绘制框 for (x, y, w, h) in signs: cv2.rectangle(img, (x,y), (x+w,y+h), (255, 255 , 255), 8) # 将处理后的图像添加到列表 img_list.append(img)
如果必须适配原有字典展示代码,只需一行即可把列表转成符合要求的字典:
img_dict = dict(enumerate(img_list))
内容的提问来源于stack exchange,提问作者jport
相关产品推荐
相关产品推荐

