用于附加变量的Python递归函数

时间:2018-08-13 17:07:23

标签: python

我正在尝试使用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)  

我已经用递归标记了这篇文章,因为我认为我可能会丢失一些该函数调用自身的代码(因此会随每个连续的图像进行更新),但不理解如何正确调用它。再次,帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

我认为,尽管我没有完全理解其意图,但它比必要的更为复杂。为什么不完全放弃该功能。

我建议您简单地修改:

  • 删除功能。
  • 使用cloud_count = 0开头的代码。
  • 在for循环中遵循以下内容进行counts声明。

if counts > 2000: cloud_count += 1

  • print修改为print(cloud_count)

答案 1 :(得分:1)

无需递归;您已经完成了访问和计算所需像素的艰苦工作。从这里开始:

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

现在,让我们获取所有 all 云检测列表,遍历输入集:

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)

这可以解决问题吗?