2026年6月10日水曜日

考古学切手 ネフェルティティ胸像

 Archaeological Stamp: Bust of Nefertiti


I enjoyed collecting stamps depicting the bust of Nefertiti from my archaeological stamp collection.


考古学切手マイコレクションの中からネフェルティティ胸像が描かれた切手を集めて楽しみました。

1 ネフェルティティ胸像 アラブ連合共和国発行


ネフェルティティ胸像 アラブ連合共和国発行

1960年

普通切手

2 ネフェルティティ胸像 アラブ連合共和国発行


ネフェルティティ胸像 アラブ連合共和国発行

1959年

パレスチナ(ガザ地区)向け普通切手

未使用

3 ネフェルティティ胸像 エジプト発行


ネフェルティティ胸像 エジプト発行

1950年代

普通切手

4 ネフェルティティ胸像 アラブ連合共和国発行


ネフェルティティ胸像 アラブ連合共和国発行

1950年代~1960年代

普通切手

5 ネフェルティティ胸像 エジプト発行


ネフェルティティ胸像 エジプト発行

1950年代

普通切手

6 ネフェルティティ胸像 エジプト発行


ネフェルティティ胸像 エジプト発行

1950年代

普通切手

7 ネフェルティティ胸像 エジプト発行


ネフェルティティ胸像 エジプト発行

1956年

国際博物館週間(Semaine Internationale des Musées)記念切手

未使用

8 ネフェルティティ胸像 モザンビーク発行


ネフェルティティ胸像 モザンビーク発行

2002年

記念切手

9 ネフェルティティ胸像 モザンビーク発行


ネフェルティティ胸像 モザンビーク発行

2002年

記念切手

10 ネフェルティティ胸像 モザンビーク発行


ネフェルティティ胸像 モザンビーク発行

2002年

記念切手

11 ネフェルティティ胸像 グレナダ発行


ネフェルティティ胸像 グレナダ発行

12 ネフェルティティ胸像小型切手シート トーゴ共和国発行


ネフェルティティ胸像小型切手シート トーゴ共和国発行

2013年

ネフェルティティ胸像発見100周年記念切手

13 ネフェルティティ胸像 フジャイラ発行


ネフェルティティ胸像 フジャイラ発行

1966年

カイロ国際切手展(エジプト切手発行100周年記念)記念切手

14 ネフェルティティ胸像 エジプト発行、アラブレング共和国発行


ネフェルティティ胸像 エジプト発行、アラブレング共和国発行

1950年代~1960年代

普通切手




2026年6月9日火曜日

円環状雨雲はエコー

 Annular Rain Clouds are Echoes


On June 3, 2026, I reported that an annular rain cloud had appeared on the Japan Meteorological Agency's rain cloud movement map. The Japan Meteorological Agency responded that it was an echo caused by differences in the sensitivity of nearby and distant radar sites.


2026.06.03に気象庁雨雲の動きマップに円環状雨雲が表現されたことを情報発信しましたが、気象庁より近傍と遠方のレーダーサイトの感度の違いによるエコーであるとの回答をいただきました。

2026.06.04記事「マップに表現された円環状雨雲」に関連して、気象庁に問い合わせたたところ、大気海洋部ご意見メール担当様から次の回答をいただきました。(2026.06.09)

丁寧な回答に感謝申し上げます。

【回答】

-----------------------

気象庁 | 雨雲の動き・雷活動度・竜巻発生確度(ナウキャスト) をご覧いただきありがとうございます。

レーダサイト近傍と遠方で異なる電波を使っているため、その境界付近で感度の違い等により円弧状のエコーが生じることがあります。

今回の事象はそれによるものと思われます。

雨雲の動きでは国土交通省設置のレーダーも利用しており、今回は国土交通省が千葉県に設置したレーダーで発生したものと推定されます。

以下の国土交通省のHPでも解説がありますので、ご参照ください。

川の防災情報 - 国土交通省:レーダ雨量 ご利用上の注意


QGISを使った3種の疑似座標GIS解析を比較してみました

 I compared three types of pseudo-coordinate GIS analysis using QGIS.


I define pseudo-coordinate GIS analysis as a method of analyzing geographic information independently of the actual geographic space by using QGIS coordinates as dummy data. I compared and examined the usability of three pseudo-coordinate GIS analysis methods, each differing in their use of coordinate reference systems (CRS).


QGISの座標をダミーとして使って、現実地理空間とは無関係に地理情報を解析する方法を疑似座標GIS解析と呼ぶことにします。座標参照系(CRS)利用法の違いによる3つの疑似座標GIS解析法について、その使い勝手を比較して確かめてみました。

1 疑似座標GIS解析について


有吉北貝塚北斜面貝層の発掘平面図(発掘調査報告書から引用)

上図は地図上で任意位置に設定したグリッドに基づいて発掘が行われた事例です。遺物などの位置情報もグリッドを基準に収集されています。このような事例で解析にGISを使う場合、方位をGISに合わせるとそれに合わせてグリッド単位の遺物情報も全て変換する必要があり、とても複雑になります。方位を北上で表現しているGIS画面からグリッド線が水平垂直になるように表現し直すことも複雑な操作となります。またこの図だけからこの図をGISにジオリファレンスすることはできないので、別の正確な位置図が必要になり、手間がかかります。

このような各種不都合を避けて、上図と関連情報を現実地理空間とは無関係に直接GISにプロットしてGIS解析する方法を疑似座標GIS解析と呼ぶことにします。

疑似座標GIS解析を使えば、座標位置が不明確な地理情報、局地的分布資料や略図などもGISで気軽に解析できるようになります。

2 3種の疑似座標GIS解析法

座標参照系(CRS)利用法の違いにより、疑似座標GIS解析を次の3つに区分して、その使い勝手をQGISで比較して確かめてみました。

・座標参照系なし利用法(CRSなし)

・カスタム座標参照系利用法(カスタムCRS)

・既存座標参照系のダミー利用法(ダミーCRS)

3 疑似座標GIS解析法のテスト

まずQGISに、発掘平面図をジオリファレンスでインポートし、さらに標高点群csvファイルをレイヤー追加でインポートしました。


発掘平面図(ジオリファレンス用)


参考 ジオリファレンス資料

次に標高点群資料からTIN補間で地形3Dモデルを作成し、標高点群資料と地形3DモデルをQgis2threejsで立体表示しました。

4 座標参照系なし利用法(CRSなし)

4-1 プロジェクトCRSの設定

プロジェクトCRSをCRSなしに設定します。


CRSなしの設定

4-2 発掘平面図のジオリファレンス

発掘平面図をジオリファレンスします。ジオリファレンスの項目でCRS入力欄があり、この中にCRSなしがありません。そこで今回はダミーでEPSG6677を入れました。

4-3 標高点群csvファイルのレイヤ追加

標高点群csvファイルをレイヤー追加します。追加の際、CRS入力欄があり、この中にCRSなしがありません。そこでダミーとしてEPSG6677を入れました。

4-4 標高点群から地形3Dモデルの作成

標高点群からTIN補間で地形3Dモデルを作成しました。

4-5 Qgis2threejsによる立体表示


Qgis2threejsによる立体表示結果

標高点群は立体表示できます。しかし地形3Dモデルは立体表示できません。プロジェクトCRSをEPSG6677にすると地形モデルも立体表示されます。

4-6 感想

情報をプロットする際にダミーCRSの入力が必要なことと、Qgis2threejsがCRSのない地形3Dモデルを受け付けないことから、この方法は実用性が低いといえます。

ちなみにこのQGISにGoogleMapを投影すると、(0,0)は大西洋上の赤道と子午線交点になります。

5 カスタム座標参照系利用法(カスタムCRS)

5-1 プロジェクトCRSの設定

設定→カスタム投影法で開く画面で新しいユーザー定義CRSを追加して、形式欄に次のスクリプトを記入して、CRSの名前も設定してカスタムCRSを定義しました。

入力した定義スクリプト(Proj文字列)

+proj=tmerc +lat_0=0 +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs

入力した名前

Local_XY_meter


ユーザー定義CRS画面

プロジェクトCRSをクリックして開く画面に座標参照系として次の新しい座標参照系が設定されているので、適用します。

USER:100026-Local_XY_meter


ユーザーCRSを適用している様子

5-2 発掘平面図のジオリファレンス

発掘平面図をジオリファレンスします。ジオリファレンスの項目のCRS入力欄にはUSER:100026を入れます。

5-3 標高点群csvファイルのレイヤ追加

標高点群csvファイルをレイヤー追加します。追加の際のCRS入力欄にはUSER:100026を入れます。

5-4 標高点群から地形3Dモデルの作成

標高点群からTIN補間で地形3Dモデルを作成しました。

5-5 Qgis2threejsによる立体表示

標高点群と地形3Dモデルは正常に立体表示できました。


Qgis2threejsによる立体表示

5-6 感想

最初にカスタムCRSを設定することが手間になります。

ちなみにこのQGISにGoogleMapを投影すると、(0,0)は大西洋上の赤道と子午線交点になります。

6 既存座標参照系のダミー利用法(ダミーCRS)

6-1 プロジェクトCRSの設定

今回はEPSG6677を使いました。

6-2 発掘平面図のジオリファレンス

発掘平面図をジオリファレンスします。CRSはEPSG6677です。

6-3 標高点群csvファイルのレイヤ追加

標高点群csvファイルのレイヤを追加します。CRSはEPSG6677です。

6-4 標高点群から地形3Dモデルの作成

標高点群からTIN補間で地形3Dモデルを作成しました。

6-5 Qgis2threejsによる立体表示

標高点群と地形3Dモデルは正常に立体表示できました。


Qgis2threejsによる立体表示

6-6 感想

通常のQGIS利用と全く同じ方法で利用できました。

ちなみにこのQGISにGoogleMapを投影すると、(0,0)は野田市中里付近になります。

7 まとめ

次の順番で使い勝手が良くなることを理解しました。

・座標参照系なし利用法(CRSなし) 難あり

・カスタム座標参照系利用法(カスタムCRS) 余分な手間がかかる

・既存座標参照系のダミー利用法(ダミーCRS) 通常利用と同じ(難無し)

CRSなしやカスタムCRSに利用利点があるかもしれないと考えて(期待して)実施したテストですが、その期待ははずれ、ダミーCRS利用がもっとも良いことが判りました。


2026年6月8日月曜日

第30断面(剥取断面)出土土器の型式

 Types of Pottery Excavated from Section 30 (Exfoliated Section)


I have examined the types of pottery excavated from Section 30 (exfoliated section). The number of pottery fragments whose types can be identified is limited, so only limited information can be obtained. It is clear that the sloping shell layer in this section dates back at least to the Nakabyo period, and that the channel-type shell layer was formed during the Kasori EII new stage. If the types of pottery fragments excavated from the collapsed layer can be identified, the age of the cliff formation (i.e., the start of shell mound utilization) can be estimated.


第30断面(剥取断面)出土土器の型式を概観してみました。型式が判る土器片の数が限られ限定的な情報しか得られません。この断面の斜面性貝層が少なくとも中峠式期まで遡ることと、流路性貝層が加曽利EⅡ式新段階期に形成されたことは判ります。崩落層中から出土した土器片の型式が判れば、急崖形成年代(=貝塚利用開始時期)が推定出来ます。

1 第30断面(剥取断面)±0.5m幅ボックス内土器片の検討


第30断面(剥取断面)±0.5m幅ボックス内土器片の投影図


第30断面(剥取断面)±0.5m幅ボックス内土器片の投影図


参考 第30断面(剥取断面)の貝層区分(案)

1-1 型式判明土器片

型式が判る土器片の数17、型式が調べられていない土器片の数883です。型式が判った出土土器片が存在していること自体大変素晴らしい発掘成果ですが、その数はこの断面では1.93%に過ぎません。(北斜面貝層全体で3D座標を備える型式判明土器片数は647、全土器片数は17481で、型式判明土器片数率は3.7%です。)

1-2 斜面性貝層

斜面性貝層で型式が判っている土器片は3つです。この情報から次のことが判明します。

この斜面での土器片投棄(=貝殻投棄)は少なくとも中峠式期に遡ることが確認できます。

R1層から中峠式土器が出土していますが、この情報から言えることは「R1層は中峠式期かそれ以降の時期に堆積した」ということです。斜面性貝層では斜面上部で各時期の土器片が混じる可能性があるので、出土土器片の情報だけからその貝層堆積の時期をドンピシャ確定することは困難です。多数土器片の型式が判れば、ある程度絞って堆積時期を推定することができます。

R3層から中峠式土器が出土しています。この貝層は別の検討でもっと新しい時期と推定しています。また同じ中峠式土器が出土したR1層より堆積時期が新しい貝層です。従って、R3層堆積時期推定に中峠式土器片出土を使うことはできません。

S3層から加曽利EⅡ式中~新段階土器が出土しています。この情報だけから言えることは「S3層は加曽利EⅡ式中~新段階期かそれよりも新しい時期に堆積した」ということです。しかし、S3層の下層のX層からより新しい加曽利EⅡ式新段階土器が出土しているので、他のS3層出土土器片を調べれば加曽利EⅡ式新段階土器が含まれていることが想定できます。

1-3 流路性貝層

X層とD4層から型式判明土器片14が出土しています。最も新しいのは加曽利EⅡ式新段階土器です。

流路性貝層は斜面性貝層が高濃度流(土石流類似事象)で運ばれてきて堆積したもので、母層は各時期斜面性貝層です。従って、複数の土器型式が含まれていて、その堆積時期は最も新しい型式の時期かそれより新しい時期です。北斜面貝層における貝層発達は加曽利EⅡ式新段階期で終了しますので、X層とD4層の堆積時期は加曽利EⅡ式新段階期と特定できます。

2 崩落層出土土器片


崩落層中の貝殻含有層と出土土器片

崩落層中から土器片が出土しています。また崩落層の基底層は貝殻を含有しています。この事実から次の事柄を確認することができます。

・ガリー侵食でフレッシュな急崖(比高8m)が出来た直後から貝殻・土器片投棄が行われた。

・その後急崖上部の崩壊(崖崩れ)が生起したが、この崩壊現象が生じた期間にも土器片投棄が行われた。

・急崖上部が崩壊して急崖全体が安定してから貝殻投棄(及び遺物投棄)が本格化した。

以上の事実から、崩落層中土器片の型式が判明すれば、第30断面における急崖形成時期=貝殻投棄開始時期が判明します。

2026年6月7日日曜日

崩落層の母層(崩落母層)の推定

 Estimation of the Parent Layer of the Collapse Layer


In the shell midden on the northern slope of the Ariyoshi Kita Shell Mound, the collapse layer is deposited in almost all areas below the cliff formed by gully erosion. The location of the parent layer of this collapse layer was estimated using Section 30 (exfoliation section) as an example.


有吉北貝塚北斜面貝層ではガリー侵食でできた崖下のほとんどの場所に崩落層が堆積しています。この崩落層の母層(崩落母層)の位置を第30断面(剥取断面)を例に推定しました。

1 第30断面(剥取断面)の崩落層


第30断面(剥取断面)の貝層区分(案)と崩落層

2 第30断面(剥取断面) 崩落層と地形断面との関係


第30断面(剥取断面) 崩落層と地形との関係 Blender3Dビューポート


第30断面(剥取断面) 崩落層と地形断面との関係

3 第30断面(剥取断面) 崩落層と母層(崩落母層)の推定


第30断面(剥取断面) 崩落層と母層(崩落母層)の推定

崩落層と地形との関係から、崩落層が崖上から崩落してきたと考えることから、崩落層は成田層の崖崩れで生じたと考えることができます。崩落母層は成田層とその上の関東ローム層で、その範囲は地形断面的に上図のように推定できます。


2026年6月5日金曜日

有吉北貝塚北斜面貝層 二次堆積貝層が最初に投棄された場所の推定

 Estimation of the Initial Disposal Location of the Secondary Deposit Shell Layer on the North Slope of the Ariyoshi Kita Shell Mound


While the shell layer in the second cross-section of the Ariyoshi Kita Shell Mound's north slope shell layer is observed to be almost entirely a secondary deposit, I have estimated the initial disposal location of this shell layer. Based on the 3D spatial distribution of the shell layer, it is thought to be near the head of the western tributary valley of the gully.


有吉北貝塚北斜面貝層の第2断面の貝層はほとんど二次堆積貝層であると観察できますが、その貝層が最初に投棄された場所を推定しました。3D空間の貝層分布からそれはガリー西支谷の谷頭部付近であると考えられます。

1 第2断面の貝層がほとんど全て二次堆積貝層であると考える根拠


第2断面の貝層がほとんど全て二次堆積貝層であると考える根拠

加曽利EⅡ式新段階土器は有吉北貝塚で最も新しい土器です。この土器が第2断面貝層の最下部層付近から出土しています。このことから、第2断面貝層は加曽利EⅡ式新段階期に別の場所に堆積していた貝層が移動して二次堆積したと判断できます。

2 第2断面で観察できる貝層(二次堆積貝層)が最初に投棄された場所


第2断面で観察できる貝層(二次堆積貝層)が最初に投棄された場所

ガリー東支谷がガリー谷頭部の台地縁まで貝層が分布しているのと対照的に、ガリー西支谷の上部には貝層が分布していません。この部分に本来堆積していた貝層が高濃度流(土石流)でガリー下流に流下したと想定します。

3 感想

北斜面貝層発達最終局面(加曽利EⅡ式新段階期)に、ガリー谷頭西支谷で規模の大きな崩壊・高濃度流が発生して、その高濃度流堆積物が下流に運ばれたという予備解釈を持ちました。


2026年6月4日木曜日

考古学切手 アブシンベル神殿 その6

 Archaeological Stamps: Abu Simbel Temples, Part 6


I recently acquired a sheet of miniature stamps issued by Uruguay depicting the Abu Simbel Temples, and enjoyed using them, adding them to my collection.


アブシンベル神殿を描いたウルグアイ発行の小型切手シートを新たに入手して楽しみ、マイコレクションに納めました。

この記事は2026.05.08記事「考古学切手 アブシンベル神殿 その5」の続きです。

1 アブシンベル神殿のラムセス2世 ウルグアイ発行


アブシンベル神殿のラムセス2世 ウルグアイ発行

1964年

「ヌビアの遺跡を守ろう(Monumentos de Nubia)」のUNESCO国際キャンペーン記念小型切手シートの1枚

2 「ヌビアの遺跡を守ろう」のUNESCO国際キャンペーン記念小型切手シート ウルグアイ発行


「ヌビアの遺跡を守ろう」のUNESCO国際キャンペーン記念小型切手シート

1964

左下切手はラムセス2世像が頭部を残して水没しているイメージ画像

3 感想

同じ図柄で目打ちのある切手も発行されています。記念小型切手シートは目打ちがありません。但し裏面にはノリが付いていて、ハサミで切れば封筒などに貼れて実用できる配慮はされています。個人的には目打ちのない切手やノリのない切手は切手らしくないので、目打ちのある切手を好みます。


有吉北貝塚北斜面貝層第2断面の人骨分布

 Distribution of Human Remains in the Second Section of the Shell Layer on the North Slope of the Ariyoshi Kita Shell Mound


I examined the relationship between the shell layer and the human remains found in the second section of the shell layer on the north slope of the Ariyoshi Kita Shell Mound. The human remains appear to have been carried in mainly from the western tributary valley and are scattered throughout the shell layer strata. It is reasonable to assume that the remains were swept away by a high-concentration current from their original location (burial site).


有吉北貝塚北斜面貝層第2断面の貝層と人骨出土との関係を見てみました。人骨は主に西側支谷から流れ込んだ様相を示し、貝層分層に散開して分布しています。本来存在していた場所(埋葬場所)から高濃度流で流亡したと考えることが合理的です。

1 第2断面付近の人骨分布状況


第2断面付近の人骨分布状況 Blender3Dビューポート画面

人骨データは発掘調査報告書掲載人骨データです。

2 第2断面 人骨分布


第2断面 人骨分布

断面から±0.5m幅のブロック内の人骨分布図です。

3 第2断面 人骨分布ヒートマップ


第2断面 人骨分布ヒートマップ

4 第2断面 人骨分布ヒートマップ(セクション図オーバーレイ)


第2断面 人骨分布ヒートマップ(セクション図オーバーレイ)

5 人骨分布ヒートマップ(発掘調査報告書掲載貝層区分図オーバーレイ)


人骨分布ヒートマップ(発掘調査報告書掲載貝層区分図オーバーレイ)

6 メモ


人骨分布立面図・平面図


人骨が埋葬場所から流亡した可能性

人骨は主に西側支谷から、一部は東側支谷から流れ込んだ様相を示しています。第2断面貝層分層との関係では特定の分層に集中することなく、散開的に分布しています。

この分布は第2断面のほとんどの貝層が加曽利EⅡ式新段階期に発生した高濃度流の二次堆積層であるという見立てと整合します。

2026.06.02記事「メモ 型式別土器情報の層位的逆転現象 その2

第2断面付近の人骨分布はほとんど全て本来存在していた場所(埋葬場所)から高濃度流で流亡したものと考えることが合理的です。

加曽利EⅡ式新段階期以前に、ガリー谷頭付近に安定した埋葬場所があり、その埋葬場所が加曽利EⅡ式新段階期に発生した高濃度流で破壊され、人骨(と恐らく副葬品)が高濃度流でガリー下流に運ばれたと想定します。

土器密集域と人骨分布が近似するので、廃用土器の投棄場所と埋葬場所は関連していた可能性があります。


マップに表現された円環状雨雲

 Annular Rain Cloud Displayed on Map


Around 4 PM on June 3, 2026, for about an hour, a stationary annular rain cloud was displayed on the Japan Meteorological Agency's rain cloud movement map near Chiba City. Its diameter was 15-16 km. If this is a natural phenomenon, it's quite interesting. It might be a system bug.


2026年6月3日16時頃から1時間ほど千葉市付近で移動しない円環状雨雲が気象庁雨雲の動きマップで表現されました。直径は15~16㎞あります。自然現象なら興味深いことです。システムのバグかもしれません。

1 マップに表現された円環状雨雲


マップに表現された円環状雨雲(画像)気象庁ホームページから引用


マップに表現された円環状雨雲(動画)気象庁ホームページ画面を引用して作成

2026年6月3日16時頃から1時間ほど千葉市付近で移動しない円環状雨雲が気象庁雨雲の動きマップで表現されました。直径は15~16㎞あります。自然現象なら興味深いことです。システムのバグかもしれません。


2026年6月3日水曜日

技術メモ pngファイルから直接ヒートマップを作成するPythonスクリプト

 Technical Memo: Python Script to Create Heatmaps Directly from PNG Files


I created a Python script that directly outputs heatmaps from dot distribution images (PNG files). Previously, I used QGIS functions to create heatmaps, but this significantly improves work efficiency.


ドット分布画像(pngファイル)から直接ヒートマップをアウトプットするPythonスクリプトを作成しました。これまではQGIS機能を利用してヒートマップを作成していたのですが、それと較べると著しく作業効率が向上しました。

1 Pythonスクリプトによるヒートマップ作成


利用画像(ドット分布画像、背景が透明なpng画像)

ドット分布画像を用意します。背景が白地の場合は背景が透明なpngファイルにします。

ドットの色の面積をpixel単位に計測して、それによりヒートマップを作成するので、ドットが重なってつぶれていても、データは近似的に利用できます。


ヒートマップ

単色グラデーションによるヒートマップを作成します。

ヒートマップ作成は次の項目を変更して望みのイメージに合うまで試行できます。

色、グラデーションの区分、ぼかし半径


ヒートマップとドット分布図のオーバーレイ画像

2 使い勝手

これまではQGIS機能を利用してヒートマップを作成していたのですが、Pythonを使うと著しく作業効率が向上しました。

ドット分布図のドットが重なってつぶれているような場合でも、データとして近似的に利用できるので、ヒートマップの趣旨(分布概要をざっくり把握する)とも合います。

3 Pythonスクリプト


import cv2
import numpy as np
from PIL import Image
from matplotlib import cm

# =========================
# 設定
# =========================

# ドット分布図のパスとアウトプットのパス→変更してください
input_path = r"G:/test/aaa.png"
output_path = r"G:/test/aaa_heatmap.png"

# 使用する単色グラデーション
# 例: "Blues", "Reds", "Greens", "Purples", "Oranges", "Greys"
color_map_name = "Purples"

# グラデーションの区分数
# 例: 5, 8, 10, 16, 32
gradient_steps = 10

# 密度計算のぼかし半径
# 大きいほど広くなめらかな密集度になる
blur_radius = 50

# 背景を透明にするか
transparent_background = False

# =========================
# 処理
# =========================

# 画像読み込み
img = cv2.imread(input_path, cv2.IMREAD_COLOR)
if img is None:
    raise FileNotFoundError(f"画像が読み込めません: {input_path}")

# RGBへ変換
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 黒背景以外の点を抽出
# 青い点など、黒でないピクセルを遺物ドットとみなす
gray = cv2.cvtColor(rgb, cv2.COLOR_RGB2GRAY)
dot_mask = gray > 1

# 密度画像を作成
density = dot_mask.astype(np.float32)

# ガウシアンぼかしで密集度を計算
density = cv2.GaussianBlur(
    density,
    ksize=(0, 0),
    sigmaX=blur_radius,
    sigmaY=blur_radius
)

# 0〜1に正規化
if density.max() > 0:
    density = density / density.max()

# グラデーションを段階化
density_step = np.floor(density * gradient_steps) / gradient_steps
density_step = np.clip(density_step, 0, 1)

# カラーマップ適用
cmap = cm.get_cmap(color_map_name)
heat_rgba = cmap(density_step)

# 0〜255へ変換
heat_img = (heat_rgba[:, :, :3] * 255).astype(np.uint8)

# 密度ゼロ部分の処理
if transparent_background:
    alpha = (density > 0).astype(np.uint8) * 255
    output = np.dstack([heat_img, alpha])
    Image.fromarray(output, mode="RGBA").save(output_path)
else:
    # 背景は白
    heat_img[density <= 0] = [255, 255, 255]
    Image.fromarray(heat_img, mode="RGB").save(output_path)

print(f"ヒートマップを書き出しました: {output_path}")