[英]Python recursive function for appending variable
我正在尝试使用OpenCV评估文件夹中的一系列图像以覆盖云。 我为图像是否包含云确定了一个非常简单的二进制阈值:在图像的子集“ summit_roi”中,如果值<50的单个像素数大于2000,则该图像是无云的(每个图像是512h x 644w像素的.png文件,每个像素的值在0到256之间)。
我想一张一张地循环浏览图像,并为每个图像返回单独的0或1值,其中“ 1”是无云的,“ 0”是阴天的。 然后,我想将每个单独的值附加到一个变量,一旦脚本在图像文件夹中运行,该变量将返回文件夹中图像总数的单个值,值为1(例如,如果存在该变量,则该变量返回52是52个无云图片)。
我在编写将返回此变量的循环时遇到困难。 任何帮助表示赞赏。 抱歉,如果我的问题与先前发布的问题过于相似,但我没有找到任何问题! 这是我到目前为止的内容:
#loop through image_path_list to open each image
for imagePath in image_path_list:
image = cv2.imread(imagePath, 0)
print(image.shape)
#create ROI
#ROI formula: roi = image[y:y+h, x:x+w]
summit_roi = image[100:200, 250:450]
#draw ROI rectangle on image
#draw rectangle formula: cv2.rectangle(img, (x1, y1), (x2, y2), (255,0,0), 2)
cv2.rectangle(image,(250,100), (450,200), (255,0,0), 2)
#determine various image details
#print('Shape of summit ROI array is', np.shape(summit_roi))
counts = (summit_roi < 50).sum()
print('Sum of pixels with value < 50 is', counts)
#create function to count images meeting threshold conditions
def cloud_detector(counts):
cloud_list = []
for imagePath in image_path_list:
if counts > 2000:
return [1]
cloud_list.append(cloud_detector(counts))
else:
return []
print(cloud_list)
我用递归标记了这篇文章,因为我相信我可能会丢失一些该函数调用自身的代码(因此会随每个连续的图像进行更新),但不理解如何正确调用它。 再次,帮助赞赏!
我认为,尽管我没有完全理解其意图,但它比必要的更为复杂。 为什么不完全放弃该功能。
我建议您简单地修改:
cloud_count = 0
。 if counts > 2000: cloud_count += 1
print
修改为print(cloud_count)
。 无需递归; 您已经完成了访问和计算所需像素的艰苦工作。 从这里开始:
counts = (summit_roi < 50).sum()
让我们用两种方法来获得所需的结果。 首先,让我们使用counts
来整齐地获取一张图像的结果:
dark_pixel_count = (image[100:200, 250:450] < 50).sum()
现在,针对您是否存在云的布尔决策添加针对2000的检查:
is_cloud = (image[100:200, 250:450] < 50).sum() > 2000
请注意,我如何在每个步骤中添加新的子句或说明,以重命名结果。 您可以通过连续的步骤和中间变量名称来完成所有这些操作。 这对于调试非常有用。 一些单行计算更“ Pythonic”。
is_cloud
是一个简单的布尔值( True / False
)。 接下来,备份并直接从源头获取image
。 我们在哪里
for imagePath in image_path_list:
image = cv2.imread(imagePath, 0)
is_cloud = (image[100:200, 250:450] < 50).sum() > 2000
代替image
is_cloud = (cv2.imread(imagePath, 0) [100:200, 250:450] < 50).sum() > 2000
现在,让我们遍历输入集获得所有云检测的列表:
is_cloud_list = [ (cv2.imread(imagePath, 0) [100:200, 250:450] < 50).sum() > 2000
for imagePath in image_path_list ]
这给了我们一个布尔值列表,每个图像一个。 现在,我们只计算有多少个True
:
cloud_count = [ (cv2.imread(imagePath, 0) [100:200, 250:450] < 50).sum() > 2000
for imagePath in image_path_list ].count(True)
这样可以解决问题吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.