[Python+OpenCV編]気象衛星画像に天気図を重ねてみる
はじめに
以前、「気象衛星画像に天気図を重ねてみる」をテーマに、2つのnoteを投稿した。
第一弾は、ImageMagickを使い、コマンドラインで重ね合わせ画像を作るというものだった。10年以上前に他のブログで紹介していたものを再編集してまとめたものだ。
第二弾は、Python + PILで重ね合わせ画像を作るというもの。
意外にもこの2つnoteは、私のnote中で現在のところ、アクセス数が1位、4位となっている。
そこで、調子に乗って、今回の第三弾もやってみる。Python + OpenCVで重ね合わせ画像を作ってみた。
どうしてOpenCVでもやろうと思ったのか?
理由は、下記の2つ。
1) OpenCVであれば、Python以外も使える
2) 近々業務でOpenCVを使って、画像処理をするかもしれないので
まず、1)については、C/C++、Javaでも使えるようだ。さらには、Windows、Mac、Android、iOSでも使えるらしい。OpenCVSharpというラッパーもあるので、Windows上でC#を使った開発も可能だ。移植もしやすいだろうと思う。
2)は単なる自己都合。ちょっと勉強しておこうというのが今回の本当のモチベーション。。。
ソースコード
で、いきなりソースコードを示す。
#!/usr/bin/env python3
# coding: utf-8
import os
import sys
from pdf2image import convert_from_path
from PIL import Image
import numpy as np
import cv2
# 衛星画像を読み出し
satelliteimg = cv2.imread('202005140300-00.png')
# PDFファイルを読み込み、画像データに変換
pdfimg = convert_from_path('ASAS.pdf', 600)[0].convert('L')
# numpy配列に変換
mapimg = np.asarray(pdfimg)
# トリミング
mapimg = mapimg[1470:1470 + 1725, 1460:1460 + 2170]
# リサイズ
mapimg = cv2.resize(mapimg, (satelliteimg.shape[1], satelliteimg.shape[0]))
# 白黒反転
mapimg = cv2.bitwise_not(mapimg)
# BGRに変換
mapimg = cv2.cvtColor(mapimg, cv2.COLOR_GRAY2BGR)
# 重ね合わせ
rows,cols,channels = mapimg.shape
roi = satelliteimg[0:rows, 0:cols]
img2gray = cv2.cvtColor(mapimg, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
img1_bg = cv2.bitwise_and(roi, roi, mask = mask_inv)
img2_fg = cv2.bitwise_and(mapimg, mapimg, mask = mask)
dst = cv2.add(img1_bg, img2_fg)
satelliteimg[0:rows, 0:cols ] = dst
cv2.imwrite('output.png', satelliteimg)
いつもの通りで恐縮だが、ソースコードの詳細については解説しない。
要点だけ説明すると、「# 重ね合わせ」のコメント以降は、OpenCVのチュートリアルのほぼコピペなので、下記を参考にして欲しい。
下記も参考にさせてもらった。
無駄な処理があるとかもしれないが、上記サイトのコードを活かした処理にした。前半部分から重ね合わせ部分のつなぎは少し工夫できる?
できあがり
※衛星画像は気象庁より、天気図はHBC北海道放送より頂いた
Python + PILよりもコードは複雑になるが、OpenCVでも同じことができることが分かる。
(おまけのお天気解説)
日本列島に中心をもつ高気圧に被われ、日本列島は広い範囲で晴れ間が広がっている。北海道の東には低気圧があり、東に遠ざかっており、また、日本の南の海上には停滞前線が延びている。大陸には停滞前線に伴う雲が広がり、ゆっくりと日本列島に近づき、午後以降は次第に西から雲が多くなる見込み。
よろしければ、サポートをお願いします。 より多くの方に役立つnoteを書けるよう頑張ります!!