for循环存储Distance、Speed到数组用于PLT绘图时仅保留单值的问题
数组仅保存最后一次计算值的问题排查
出错核心逻辑
- 数组初始化位置错误:
amount_list、amount_list_shifted两个存储列表被写在for循环内部,每遍历一张图像就会重新执行「创建新空列表、存入当前计算值」的操作,之前循环计算的所有历史值会被直接清空。等全量遍历结束后,列表里自然只剩最后一次循环算出的数值;加上代码里每次初始化后还追加重名的相同值,就出现了你运行输出里两个完全重复单值的结果。 - 冗余无效赋值:循环内先执行
amount_list=[Distance]把当前值作为列表初始元素,又执行amount_list.append(curr_dis)往列表里加值,而curr_dis本身就是前一步赋值的Distance,等于就算列表不被重置,每次也会存两个完全一样的重复值,没有实际作用。 - 异常处理逻辑漏洞:捕获
ZeroDivisionError时仅打印提示文字,没有给对应的Average_X/Average_Y变量设置终止逻辑或兜底值。一旦某张图找不到指定颜色的像素,变量会保留上一次循环的旧值,导致本次计算的speed、Distance完全失真——你的运行输出里spect4.png就出现了黄色像素未匹配到的情况,实际计算用的Average_Y是上一张图的遗留值,结果完全错误。
代码调整方法
把存储列表移到for循环外部初始化,删掉循环内重复初始化列表的冗余代码,给找不到像素的异常场景增加跳过逻辑,避免错误值被存入数组。调整后的核心代码片段:
# 存储数组初始化放在循环外,不会被重置 all_distance = [] all_speed = [] image_list = ["spect2.png","spect3.png","spect4.png","spect5.png","spect6.png", "spect7.png","spect8.png","spect9.png","spect11.png"] for curr_img_name in image_list: print("This is the image name reading: " + curr_img_name) im = cv2.imread(curr_img_name) red = [0,0,255] X,Y = np.where(np.all(im==red,axis=2)) try: Average_X = sum(Y)/len(Y) except ZeroDivisionError: print("Zero div, no red pixel detected, skip current image") continue print(Average_X) yellow=[0,242,255] X,Y=np.where(np.all(im==yellow,axis=2)) try: Average_Y=sum(Y)/len(Y) except ZeroDivisionError: print("Zero div, no yellow pixel detected, skip current image") continue print(Average_Y) amount_shifted=(Average_Y-Average_X)/Average_X speed=amount_shifted*3000000 Distance=speed/22 print("Speed away from us: "+str(speed)) print("Distance away from us in mpc: "+str(Distance)) # 循环内仅执行追加操作,不重置列表 all_distance.append(Distance) all_speed.append(speed) fig, ax = plt.subplots(figsize=(10, 6)) print(all_distance) print(all_speed) ax.scatter(all_distance, all_speed) ax.set_xlabel("Distance (mpc)") ax.set_ylabel("Speed") plt.show()
按调整后的代码运行,所有正常完成像素检测和数值计算的图像结果都会被存入对应数组,不会出现值被清空、重复存值、异常计算的问题,后续就能正常用Matplotlib完成散点图绘制。
内容的提问来源于stack exchange,提问作者user14587199
相关产品推荐
相关产品推荐

