원격 감지 이미지 딥 러닝 샘플 쌍 제작 자습서 2 - 클라우드 콘텐츠에 따른 이미지 블록 스크리닝

이 글은 파이썬을 사용하여 원격탐사 이미지의 딥러닝 샘플 쌍을 예제와 함께 만드는 방법에 대해 자세히 설명하고, 공식 계정에 주목하고, GeodataAnalysis샘플 데이터와 코드를 얻기 위해 20230430으로 회신합니다. 함께 있습니다.

딥러닝 모델을 훈련시키기 위해 원격탐사 이미지를 사용할 때, 이미지에 있는 구름은 모델의 훈련을 위한 이미지를 발생시킵니다. . 물론 구름 제거 또는 구름 감지 모델을 학습하는 경우 작업은 정반대이며 구름이 있는 이미지 블록을 보존해야 합니다.

앞선 글에서 모델 학습에 필요한 각 이미지 블록의 정보를 추출했다면, 이제 각 이미지 블록의 클라우드 콘텐츠를 추출하는 예시를 통해 이 정보를 활용하는 방법을 시연해 보겠습니다.

이 예제는 landsat 8의 QA band를 사용하여 픽셀이 구름에 가려져 있는지 판단하는데, 다른 데이터(Sentinel과 같이 QA band가 없는 경우)를 사용하는 경우 원본 데이터를 사용하여 구름 마스크를 먼저 만듭니다.

1 필요한 모듈 가져오기

그 중 unpackqalandsat 8의 QA 대역을 분석하는데 사용된다.

import os
import unpackqa
import numpy as np
import pandas as pd
import rasterio as rio
from rasterio.windows import Window

2 이미지 블록 정보 읽기

stat_df = pd.read_csv('./patchs.csv')
stat_df.head()

3 차후 호출을 위해 이미지 열기

여기에 언급된 이미지를 여는 것은 이 이미지의 데이터를 메모리로 읽어들이는 것이 아니라 이 이미지의 읽기 인터페이스를 얻기 위한 것입니다.

id_srcs = {
    
    }
data_dir = './data'
for id in stat_df['id'].unique():
    id_path = os.path.join(data_dir, id, id+'_QA_PIXEL.TIF')
    if os.path.exists(id_path):
        id_srcs[id] = rio.open(id_path)

4 각 이미지 패치의 클라우드 및 섀도우 콘텐츠 추출

먼저 이미지 패치의 정보를 기반으로 구름과 그림자 내용을 계산할 수 있는 함수를 정의합니다. 이전 기사에서 사용된 입력 데이터와 태그는 모두 landsat8이며 실제 응용에서는 태그가 구름 콘텐츠를 계산할 필요가 없을 수 있습니다(구름 제거 또는 구름 감지가 아닌 경우). 이미지 블록이 레이블인 경우 6-7행에 표시된 대로 0을 직접 반환합니다.

# 数据产品的名字,示例数据为C2 L2级别的landsat 8
L8_qa_product = 'LANDSAT_8_C2_L2_QAPixel'

# 获取每个影像块的云含量,输入为dataframe的一行
def cloud_and_shadow_cover(patch):
    if patch.type == 'label':
        return 0
	# 读取这个影像块对应的QA波段的值
    src = id_srcs[patch.id]
    win = Window.from_slices((patch.row, patch.row+patch.image_size), 
                             (patch.col, patch.col+patch.image_size))
    patch_array = src.read(1, window=win)

	# 解析QA波段,计算哪些像元为云或阴影,是的话返回True
    mask = unpackqa.unpack_to_array(patch_array, 
                                     product=L8_qa_product, 
                                     flags=['Cloud','Cloud_Shadow'])
    mask = np.any(mask, axis=-1)

	# 返回这个影像块的云和阴影所占的比例
    return np.count_nonzero(mask) / mask.size

이 함수를 호출하여 각 이미지 패치의 구름 및 그림자 콘텐츠를 계산합니다.

stat_df['cs_cover'] = stat_df.apply(cloud_and_shadow_cover, axis=1)
stat_df.head()

5 필터

다음 코드는 이미지 블록 thre1thre2입력 및 레이블의 클라우드 콘텐츠 임계값을 각각 필터링하는 데 사용됩니다. 임계값을 직접 설정하고 클라우드 콘텐츠가 이 임계값보다 크거나 작거나 같아야 하는지 여부를 설정할 수 있습니다.

thre1, thre2 = 0.01, 0.01
img_mask = stat_df.loc[stat_df['type']=='img', 'cs_cover']>thre1
label_mask = stat_df.loc[stat_df['type']=='label', 'cs_cover']>thre2
mask = np.all([img_mask, label_mask], axis=0)
mask = np.vstack((mask, mask)).T.flatten()

df1 = stat_df.loc[mask, :]

추천

출처blog.csdn.net/weixin_44785184/article/details/130452500