ラベル 改良 の投稿を表示しています。 すべての投稿を表示
ラベル 改良 の投稿を表示しています。 すべての投稿を表示

2026年6月22日月曜日

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

 Technical Notes: Improvements to a Python Script for Creating Heatmaps from PNG Files


I've been using a very convenient Python script to create heatmaps from dot distribution images (transparent background PNG files). However, I encountered some issues, so I've improved it. The resulting Python script is now more robust.


ドット分布画像(背景透明pngファイル)からヒートマップを作成するPythonスクリプトをとても便利に使っています。しかし、不都合が生じたので改良しました。より堅牢なPythonスクリプトとなりました。

この記事は2026.06.03記事「技術メモ pngファイルから直接ヒートマップを作成するPythonスクリプト」の続きになります。

1 遭遇した不都合


遭遇した不都合

これまで順調にpngファイルからPythonスクリプトで直接ヒートマップを作成してきました。しかし、上記のような不都合に遭遇しました。

調べたところ、画像の透明部分にRGBの色が残っている部分が存在しているために生じた現象であることがわかりました。Pythonスクリプトは透明か否かではなく、色がある部分=点群データとして扱っているので生じた不都合です。

2 不都合の解決策

この不都合の解決策として、次の2を執りました。

1 画像透明部から色を完全に除去する新たなPythonスクリプト作成。

2 色のある透明部を間違って拾わないヒートマップ作成Pythonスクリプトの作成。

それぞれのPythonスクリプトを作成しましたが、2の新たな改良ヒートマップ作成Pythonスクリプトを使う方が作業の手間がはぶけます。ヒートマップ作成Pythonスクリプトがより堅牢となりました。

3 改良Pythonスクリプト (透明部に色が残っていても正常に作動する改良版)


from pathlib import Path

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 = "Reds"

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

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

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

# 点群抽出に使うアルファ閾値
# alpha > alpha_threshold のピクセルだけを点として扱う
# 0: わずかでも不透明なら点
# 10〜30: ほぼ透明なノイズを除外
alpha_threshold = 20

# ヒートマップの透明出力時、薄い密度部分を透明にする閾値
# 通常は 0.0 のままでOK
heat_alpha_threshold = 0.0

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

input_file = Path(input_path)
if not input_file.exists():
    raise FileNotFoundError(f"画像が読み込めません: {input_path}")

# RGBAで読み込み、RGB値には依存しない
img = Image.open(input_file).convert("RGBA")
arr = np.array(img)

# アルファチャンネルだけで点群を抽出
alpha = arr[:, :, 3]
dot_mask = alpha > alpha_threshold

point_pixels = int(np.count_nonzero(dot_mask))
if point_pixels == 0:
    raise ValueError(
        "アルファ値から点を検出できませんでした。"
        f" alpha_threshold={alpha_threshold} を下げてください。"
    )

print(f"画像サイズ: {img.size[0]} x {img.size[1]}")
print(f"alpha min/max: {int(alpha.min())} / {int(alpha.max())}")
print(f"点として使うピクセル数: {point_pixels}")

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

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

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

# グラデーションを段階化
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:
    out_alpha = (density > heat_alpha_threshold).astype(np.uint8) * 255
    output = np.dstack([heat_img, out_alpha])
    Image.fromarray(output, mode="RGBA").save(output_path)
else:
    # 背景は白
    heat_img[density <= heat_alpha_threshold] = [255, 255, 255]
    Image.fromarray(heat_img, mode="RGB").save(output_path)

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

2026年5月20日水曜日

有吉北貝塚北斜面貝層の地山地形3Dモデルの改良

 Improvement of the 3D model of the natural topography of the shell layer on the northern slope of the Ariyoshi Kita Shell Mound


I created an improved 3D model of the natural topography of the shell layer on the northern slope of the Ariyoshi Kita Shell Mound by adding the surrounding topography. This allows for the confirmation of shell disposal sites and an intuitive understanding of the relationship between the shell layer and settlements on the plateau.


有吉北貝塚北斜面貝層の地山地形3Dモデルに周辺地形を付加した改良モデルを作成しました。貝殻投棄場所の確認や貝層と台地面上集落との関係を直観的に把握できるようになりました。

この記事は2026.05.16記事「有吉北貝塚北斜面貝層の地山地形3Dモデル」の続きです。

1 地山地形3Dモデル改良版


地山地形3Dモデル改良版

高さ方向を色グラデーションで示しました。


地山地形3Dモデル改良版

ワイヤフレーム表示です。


地山地形3Dモデル改良版

3Dモデルの元資料となる標高点分布です。


地山地形3Dモデル改良版

色グラデーションと標高点分布のオーバーレイ

2 追補した周辺地形標高点の作成方法(概要)

2-1 北斜面貝層地図のQGISプロット

北斜面貝層周辺の等高線が載っている北斜面貝層地図をQGISにジオリファレンスでプロットしました。

QGISは現実地理空間とは無関係に等高線から標高点を生成するツールとして利用します。つまり、QGISの疑似座標GIS解析利用です。EPSGは6677で、EPSG6677原点と図面原点を合わせて利用しました。詳しくは別記事でメモします。


北斜面貝層地図のQGISプロット(QGIS画面)

2-2 等高線トレース

等高線をトレースします。1本1本の等高線には標高値を属性として付与します。


等高線トレース(QGIS画面)

2-3 標高点抽出

QGIS機能(geometryに沿った等間隔点群)で等高線を標高値を持った点群に変換します。


標高点分布

2-3 改良版3Dモデルの作成

今回作成した周辺地形標高点と既に作成した地山地形標高点をマージして、それによりBlenderPythonで地形3Dモデルを作成しました。

3 メモ

改良モデルにより、貝殻投棄場所の確認や貝層と台地面上集落との関係を直観的に把握できるようになりました。

2022年9月29日木曜日

土器破片出土場所推測結果の検証と推測方法の改良

 Verification of estimation results of pottery fragment excavation locations and improvement of estimation methods


I verified the result of guessing the excavation site of the fragments of pottery No. 294 and improved the guessing method. As a result, it was found that the distribution of the fragments of pottery No. 294 was under the mixed shell soil layer, and that it was near the bottom of the pure shell layer and the mixed shell layer. It seems that the fragment distribution of the pottery No. 294 and the epoch of development of the shell layer are related.


294土器の破片出土場所推測結果を検証し、推測方法を改良しました。その結果、294土器破片分布はその下が混貝土層で、純貝層や混土貝層の真下付近にあたることが判りました。294土器破片分布と貝層発達画期が関連するようです。

1 出土場所推測結果の検証

3D空間において、土器破片出土場所と貝層断面図が厳密な意味で重なることはほとんどありません。そこで貝層の3D空間における傾斜を考慮して、土器破片を近くの断面図に投影して、その場所を貝層断面図上(貝層層位との関係における)出土場所としました。この土器破片3Dモデル分布と貝層断面図の関係把握方法を「貝層の趨勢的縦断勾配を考慮した方法」としました。

2022.09.26記事「「294土器破片と貝層断面図の関係」3Dモデルの作成と観察方法の初歩的検討

この方法により把握した294土器の横断図における破片出土場所推測結果を縦断図に投影することにより、その確からしさを検証しました。検証は貝層が分布して縦断図と関連する断面図2、4、5、11、12について行いました。


294土器破片と関連する貝層横断面図と縦断図

1-1 294土器の破片出土場所に関わる層位線(仮想)

2022.09.27記事「有吉北貝塚北斜面貝層から出土した294土器破片20個の出土貝層層位」で掲載した横断面図別の294土器破片出土場所推測結果から、横断面図別に破片出土場所に関わる層位線を仮想的に抽出しました。


294土器 破片2~10の出土場所に関わる層位線(仮想) 横断面図2


294土器 破片11・12の出土場所に関わる層位線(仮想) 横断面図4


294土器 破片13の出土場所に関わる層位線(仮想) 横断面図5


294土器 破片14の出土場所に関わる層位線(仮想) 横断面図11


294土器 破片15~17の出土場所に関わる層位線(仮想) 横断面図12

1-2 294土器関連層位線の縦断面図延伸

1-1で抽出した横断面図における「破片出土場所に関わる層位線」を横断面図と縦断面図の交差を利用して縦断面図に延伸しました。


294土器関連層位線の縦断面図延伸 横断面図2の上流側(仮想)


294土器関連層位線の縦断面図延伸 横断面図2の下流側(仮想)


294土器関連層位線の縦断面図延伸 横断面図4の上流側(仮想)


294土器関連層位線の縦断面図延伸 横断面図4の下流側(仮想)


294土器関連層位線の縦断面図延伸 横断面図5の上流側(仮想)


294土器関連層位線の縦断面図延伸 横断面図5の下流側(仮想)


294土器関連層位線の縦断面図延伸 横断面図11の上流側(仮想)


294土器関連層位線の縦断面図延伸 横断面図11の下流側(仮想)


294土器関連層位線の縦断面図延伸 横断面図12の上流側(仮想)


294土器関連層位線の縦断面図延伸 横断面図12の下流側(仮想)

1-3 検証

1-2の延伸結果を縦断面図に整理すると次のような結果となり、検証結果は「矛盾あり」となりました。


検証結果 「矛盾あり」

294土器関連層位線を縦断面図に延伸して描いた層位線(仮想)

破片2~14(横断面図2、4、5、11)の層位線と破片15~17(横断面図12)が指し示す層位線が異なります。294土器破片は同一時点でばら撒かれたものですから、この矛盾した結果を受け入れることは出来ません。

1-4 矛盾が生じた理由と対処の方向

Blender3D空間に身を置いて、この矛盾が生まれた理由を検討しました。その結果次の理由が判明しました。

・横断面図12付近は貝層が分布する凹地地形(ガリー侵食地形)の下流側端にあたり、貝層分布が基盤成田層の小崖付近で激しく変化する場所です。そして、横断面図の配置がその急変する貝層分布を表現出来るようになっていません。この事情から、断面図間で貝層が趨勢的に変化するという前提が成り立ちません。このいわば特殊状況を考慮しないため、(激しい貝層変化に無頓着であったため)、矛盾が生じました。

・同時に、激しい貝層変化そのものを知ることは(断面図間の貝層変化を趨勢的な方法以外で推測することは)、それができないことは最初から自明です。

・できることは、大勢的に整合し、正しいと推測できる破片2~14(横断面図2、4、5、11)の結果を矛盾した破片15~17(横断面図12)に適応して、破片位置から逆に貝層層位を推測することです。

2 土器破片出土場所推測方法の改良

「貝層の趨勢的縦断勾配を考慮した方法」(2022.09.26記事)で設定した方法に次の項目を追加して、この方法の改良版とします。

・同一土器の破片を対象にして、貝層の趨勢的勾配を考慮して土器破片と貝層層位を対応させて得た情報で矛盾が生まれた場合、大勢的に正しいと考えられる土器破片と貝層層位との関係を適用して、土器破片から逆に貝層層位を推測する。

・貝層変化が趨勢的に変化していないことが自明の場合にもこの逆思考(土器破片が貝層層位を推測する)を適用することにします。

より具体的には次のようなステップを踏むことにします。

・矛盾解消の方法として、別の場所で判明しているその土器破片の層位を、解決すべき場所に適用して、そこで観念される貝層層位の変化(非趨勢的な急激変化)が堆積学合理的に推測できるならば、それを使うことにします。

3 改良方法による土器破片出土場所推測と関連層位線の仮想

逆思考を内包した改良方法により作成した、横断面図12、13、15の土器破片出土場所に関わる層位線(仮想)を次に示します。


294土器 破片15~17の出土場所に関わる層位線(仮想) 更改版 横断面図12


294土器 破片18・19の出土場所に関わる層位線(仮想) 更改版 横断面図13


294土器 破片20の出土場所に関わる層位線(仮想) 更改版 横断面図15

4 294土器破片層位の縦断図投影


294土器関連層位線を縦断面図に延伸して描いた層位線(仮想) 更改版

考察 

混貝土層(黄色)の堆積が谷頭から下流部まであり、その堆積途中で294土器破片が広域にばらまかれました。294土器破片がばら撒かれた直後に純貝層(桃色)と混貝土層(緑色)投棄が行われました。この現象から、貝層投棄の画期と294土器破片ばら撒きが対応すると考えます。

5 感想

・土器破片を貝層層位との関係で分析するインフラ(Blenderシステム)と方法(投影方法と矛盾解消方法)の基礎が出来てきました。

・今後294土器以外の多数土器について貝層との関係を分析して情報を得ることにします。

・多数土器について、土器破片と貝層層位との関係が明らかになれば、その情報を利用して、断面図間で貝層が趨勢的に変化するという思考を捨て、同一土器破片分布から断面図間の貝層3D分布を推測することが可能になるかもしれません。


2021年5月28日金曜日

斜面貝層3Dモデルの改良

 縄文社会消長分析学習 93

有吉北貝塚北斜面貝層断面図3D表示を見やすく改良しました。

1 有吉北貝塚北斜面貝層断面図3D表示(改良版)

有吉北貝塚北斜面貝層断面図3D表示(改良版)

有吉北貝塚発掘調査報告書掲載資料塗色加工引用

3DF Zephyr v5.019でアップロード


有吉北貝塚北斜面貝層断面図3D表示(改良版)の動画

2 北斜面貝層の全体像

改良版により北斜面貝層の全体像が一望できるようになりました。精細な地形3Dモデルや精細な貝層分布3Dモデル作成のための有用な基礎資料になります。


3Dモデル画像 1


3Dモデル画像 2


3Dモデル画像 3


北斜面貝層の発掘風景

「千葉県の歴史 資料編 考古1(旧石器・縄文時代)」から引用