繁体   English   中英

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

[英]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
  • 在for循环中的counts声明后面加上以下内容。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM