衛星データを実務で使おうとすると、最初にぶつかるのが雲です。特に日本のような地域では、見たい日に晴れている保証がありません。
この回は、 の扱いと、 ── 期間の中から雲のない画素を選んで1枚を組み立てる ── を扱います。
1. 雲は思っているより多い
「たまに雲がある」程度の認識だと、実務で困ります。特定の日に、特定の場所が晴れている確率は、想像より低い。
- 梅雨・秋雨の時期は、ほぼ使えない日が続く
- 山間部は平地より雲が多い
- 衛星が通るのは数日に1回 — その日が曇りなら次まで待つ
- 部分的な雲でも、対象地域にかかれば使えない
- 薄い雲は判定が難しく、見逃されることがある
3行目と組み合わさるのが厄介です。観測の機会自体が限られているうえに、その日が曇りなら次の機会まで待つ。結果として、1か月に使える画像が1枚もないということが起こります。EP.36 で扱ったとおり衛星データは無償で得られますが、得られることと、使える画像があることは別です。
5行目が実務で問題になります。厚い雲は明らかに白いので判定できますが、薄い雲やもやは判定が難しい。見逃されたまま解析に入ると、その画素の値がわずかにずれます。変化検出(EP.37)では、この「わずかなずれ」が変化として検出されます。
2. 雲マスクを使う
多くの提供元は、雲の判定結果を同梱しています。まずこれを使います。自分で判定を作る必要はありません。
判定結果は、画素ごとに分類(雲、雲の影、雪、水、植生など)として提供されることが多い。どの分類を除外するかを決めます。
import numpy as np
# 提供元の分類値(実際の値は使うデータの仕様を確認すること)CLASSES = { 0: "無効", 1: "飽和・欠損", 3: "雲の影", 8: "雲(中確度)", 9: "雲(高確度)", 10: "薄い雲", 11: "雪・氷",}
# 除外する分類を、用途に応じて決めるEXCLUDE_STRICT = {0, 1, 3, 8, 9, 10, 11} # 厳しめ(薄い雲も除く)EXCLUDE_LOOSE = {0, 1, 3, 9} # 緩め(高確度の雲だけ)
def build_mask(scl: np.ndarray, exclude: set) -> np.ndarray: """使えない画素を True にしたマスクを返す。""" return np.isin(scl, list(exclude))
def mask_summary(scl: np.ndarray) -> None: """どの分類がどれだけあるかを出す。""" total = scl.size for value, name in sorted(CLASSES.items()): n = int((scl == value).sum()) if n: print(f" {name:12s} {n:8d} 画素 ({n / total:5.1%})")
strict = build_mask(scl, EXCLUDE_STRICT).mean() loose = build_mask(scl, EXCLUDE_LOOSE).mean() print(f"\n 厳しめの除外: {strict:5.1%} を除外 → 使える {1 - strict:5.1%}") print(f" 緩めの除外 : {loose:5.1%} を除外 → 使える {1 - loose:5.1%}")厳しめと緩めの両方を出すのが実務的です。厳しくすると使える画素が減り、緩くすると雲が混ざる。どちらを取るかは用途で決めます。片方だけを見て「使える画素が少ない」と判断すると、緩めなら足りたかもしれないという選択肢を見落とします。
| 用途 | 除外の方針 | 理由 |
|---|---|---|
| 変化検出(EP.37) | 厳しめ | わずかな雲が変化として出る |
| 広域の概観 | 緩め | 多少の雲より、埋まることを優先 |
| 時系列の追跡 | 厳しめ | 値のずれが傾向を歪める |
| 目視での確認 | 緩め | 人が見れば雲は分かる |
3. 期間合成で埋める
1枚で足りないなら、期間の中から使える画素を集めて1枚を作ります。これが 期間合成 です。
import numpy as np
def composite(images: list, masks: list, method: str = "median"): """期間内の複数の観測から、1枚を組み立てる。
images: 各時点の値の配列(同じ形) masks: 各時点の「使えない画素」を True にした配列 """ stack = np.stack([np.where(m, np.nan, img) for img, m in zip(images, masks)])
if method == "median": # 中央値: 見逃した雲の影響を受けにくい with np.errstate(invalid="ignore"): result = np.nanmedian(stack, axis=0) elif method == "first": # 最初に見つかった有効な値(最新を優先したいときは順序を逆に) result = np.full(stack.shape[1:], np.nan) for layer in stack: fill = np.isnan(result) & ~np.isnan(layer) result[fill] = layer[fill] else: raise ValueError(f"未知の方法: {method}")
# 何時点ぶんの観測から作られたか(信頼度の目安になる) n_used = (~np.isnan(stack)).sum(axis=0)
return result, n_used
# 使い方の例# merged, n_used = composite(images, masks, method="median")# print(f"1時点も使えなかった画素: {(n_used == 0).mean():.1%}")# print(f"平均で {n_used[n_used > 0].mean():.1f} 時点から合成")中央値を使うのが基本です。見逃した薄い雲があっても、複数時点の中央値なら影響を受けにくい。1枚だけを選ぶ方式では、その1枚に雲が残っていると直撃します。これは 前処理の現場 EP.22 で扱った「外れ値に強い指標を使う」のと同じ発想です。
何時点から合成したか(`n_used`)を返しているのも要点です。1時点だけから作られた画素と、5時点から作られた画素では、信頼度が違います。後段でこれを使って絞れます。
4. 期間合成の代償
便利ですが、失うものがあります。ここを理解せずに使うと、誤った解釈をします。
| 失うもの | 影響 |
|---|---|
| いつ時点かが曖昧 | 画素ごとに撮影日が違う |
| 短期間の変化が消える | 期間内に起きて戻った変化は見えない |
| 季節の途中は平均化される | 植生が変化する時期は特に |
| 時点の比較が難しくなる | 変化検出との相性が悪い |
1行目が本質的です。「2026年9月の画像」と言っても、画素ごとに9月のどの日か違う。厳密な時点の比較には使えません。
EP.37 の変化検出で期間合成を使うと、「いつからいつまでの変化か」が曖昧になります。月単位の粗い比較なら許容できますが、「この日に起きた変化」を見たい用途には使えません。用途に応じて、単一時点と使い分けてください。
5. 期間の決め方
期間を長くすれば埋まりますが、時点の曖昧さが増します。この交換を、用途で決めます。
| 期間 | 埋まりやすさ | 時点の明確さ | 向く用途 |
|---|---|---|---|
| 単一時点 | 低い(雲次第) | 明確 | 厳密な時点比較 |
| 1〜2週間 | 中 | 比較的明確 | 短期の変化 |
| 1か月 | 高い | 曖昧 | 一般的な用途 |
| 3か月(季節) | 非常に高い | かなり曖昧 | 季節ごとの傾向 |
| 1年 | ほぼ埋まる | 時点の意味が薄い | 土地被覆の分類 |
1か月が一般的な落としどころです。日本の多くの地域で埋まり、月単位の比較には使える。それで埋まらない時期(梅雨など)は、期間を延ばすか、レーダー方式を検討します。ただし山間部や離島では1か月でも埋まらないことがあるため、対象地域で実際に確認してください。
埋まらなかった画素をどう扱うかも決めてください。前後の期間から補う、欠損のままにする、前年の同時期で代用する。どれも一長一短ですが、何をしたかを記録に残すことが重要です。 のような形式で配布されているデータは部分的に取り出せるため、必要な範囲だけを何度も試すことが現実的にできます。
6. 判断の整理
この回の内容を、判断の順にまとめます。
- 1まず単一時点で足りるか確認する — 足りるならそれが最も明確
- 2足りないなら期間を決める — 用途から逆算する
- 3除外の厳しさを決める — 変化検出なら厳しめ
- 4合成方法を選ぶ — 迷ったら中央値
- 5何時点から合成したかを保持する — 信頼度の判断に使う
- 6埋まらなかった画素の扱いを決めて記録する
1番目を飛ばさないでください。期間合成は便利なので、最初から使いたくなります。しかし単一時点で足りるなら、そのほうが解釈が明確です。「いつのデータですか」と問われたときに、日付を1つ答えられるというのは、思っている以上に価値があります。
雲は想像より多く、1か月に1枚も使えないことがある。薄い雲が最も危険(見逃されてわずかにずれる)。除外の厳しさは用途で決める(変化検出なら厳しめ)。合成は中央値が基本で、何時点から作ったかを保持する。期間を延ばすほど埋まるが時点が曖昧になる(1か月が一般的な落としどころ)。次回は、雲を透過するレーダー方式を扱います。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。