我正在尝试使用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)
我已经用递归标记了这篇文章,因为我认为我可能会丢失一些该函数调用自身的代码(因此会随每个连续的图像进行更新),但不理解如何正确调用它。再次,帮助表示赞赏!
答案 0 :(得分:1)
我认为,尽管我没有完全理解其意图,但它比必要的更为复杂。为什么不完全放弃该功能。
我建议您简单地修改:
cloud_count = 0
开头的代码。 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)
这可以解决问题吗?