
Pythonããçºããçµµç»â ãŒãŽããã®ãææå€ããããŒ
ãŽããã®ææå€ãã¿ããšãã
ç
ïŒå¿ççŸè±¡ïŒããæ¬æ¥ã®ç©ççãªå¶çŽãé£ã³è¶ããŠæ°ããæ¥ç¶ïŒããããžãŒïŒãçã¿åºããã®ãããããªãã
ãšãç§ã«ã¯æãããŸãã
âŠâŠgooglecolaboãè§Šãå§ããïŒãæåã«ã¯ãäºæ³ã§ããªãã£ãåé ã ãªãããšæãªããæããŸãðæ¯æ¥AIãšã話ããªããã®è©Šè¡é¯èª€ã§ããð


ããŠãææå€ã¯åãªã颚æ¯ã®åçã§ã¯ãªãããŽããã®è³å
ã§ãæ
åãããèŠèŠããå æ ããåæ§æããæ§é ãèšè¿°ãããã®ãããããŸããã
å¿çåŠãèªç¥ç§åŠã®æèã§ã¯ãææ
ãé«ã¶ããšã泚æã®ç¯å²ãããæ
å ±ã®é¢é£ä»ãããåçã«å€åããŸãã
ãããNetworkXã§ãæå³ã®éå°é£çµããšããŠã¢ãã«åããŠã¿ãŸãããã
Pythonå®è£
æ¡ïŒæ
åã«ãããç¥èŠã®åçµ±åãã¢ãã«
éåžžã®ç¥èŠïŒå·éãªèŠç¹ïŒãšããŽããã®ç¥èŠïŒå¿ççŸè±¡ãšããŠã®ãããïŒãã°ã©ãã®ãå¯åºŠããšãæ¥ç¶ãã¿ãŒã³ãã§æ¯èŒããã³ãŒãã§ãã
import networkx as nx
import matplotlib.pyplot as plt
def create_perception_graph(connection_type="normal"):
G = nx.Graph()
# æ§æèŠçŽ ïŒæã空ã糞æãæ
elements = ["Star", "Sky", "Cypress", "Village"]
G.add_nodes_from(elements)
if connection_type == "normal":
# éåžžã®ç¥èŠïŒç©ççã«é£æ¥ãããã®ã ããç¹ããïŒç©ºãšæããªã©ïŒ
edges = [("Star", "Sky"), ("Sky", "Cypress"), ("Cypress", "Village")]
else:
# ãŽããã®ãå¿ççŸè±¡ãïŒæ
åïŒãããïŒããã¹ãŠã匷åŒã«çµã³ã€ãã
# ãã¹ãŠã®èŠçŽ ãããããããä»ããŠäºãã«é£çµãããïŒå®å
šã°ã©ãã«è¿ãç¶æ
ïŒ
edges = [
("Star", "Sky"), ("Sky", "Cypress"), ("Cypress", "Village"),
("Star", "Cypress"), # é ãã®æãšæåã®ç³žæãæ
åã§çŽçµ
("Star", "Village"), # å®å®ãšäººé瀟äŒã®çŽçµ
("Sky", "Village") # 空ã®ããããæã飲ã¿èŸŒã
]
G.add_edges_from(edges)
return G
# 2ã€ã®ç¥èŠç¶æ
ãæ¯èŒ
normal_net = create_perception_graph("normal")
gogh_net = create_perception_graph("gogh")
print(f"éåžžã®ç¥èŠã®æ¥ç¶å¯åºŠ: {nx.density(normal_net):.2f}")
print(f"ãŽããã®å¿ççæ¥ç¶å¯åºŠ: {nx.density(gogh_net):.2f}")
# å¯èŠåããŠãæ§é ã®éãããç®ã§ç¢ºèª
plt.figure(figsize=(10, 4))
plt.subplot(121); nx.draw(normal_net, with_labels=True, title="Normal Perception")
plt.subplot(122); nx.draw(gogh_net, with_labels=True, node_color='orange', title="Gogh's Psychological Optical")
plt.show()
ãæž¬ãå¿ã®äžã®ãã€ãªããéãããäžçãæž¬ã
ã¬ãŽã£ïŒã¹ãããŒã¹ã®ã·ãªãŒãºã«é¢é£ããèšãæ¹ãããŸãããç§ãã¡ãæ®æ®µãå·éã«æ¯è²ãèŠããšãã空ã¯ç©ºãå°é¢ã¯å°é¢ãšããŠåãé¢ããŠèªèããŠããŸãã
ãããããŽããã®ãææå€ãã§ã¯ã空ã®ãããã糞æããªã§ãæã®å
ãæã®å±æ ¹ãŸã§å±ããŠããããã«èŠããŸãã
ãã®ã³ãŒãã§ã¯ããã®ãå¿ã®åãã«ããæ
å ±ã®ã€ãªããããæ°å€åããŸããã
ãæ®éãã®ã°ã©ãïŒé£ãåããã®ã ãã现ã ãšã€ãªãããéããªãããã¯ãŒã¯ã
ããŽãããã®ã°ã©ãïŒæ åãšãã匷ããšãã«ã®ãŒã«ãã£ãŠãé ãé¢ãããã®å士ãç«è±ãæ£ããããã«çµã³ã€ãããéå°ã«æ¿å¯ãªãããã¯ãŒã¯ã
粟ç¥ã®äžèª¿ã¯ãæã«ããã©ãã©ã ã£ãäžçããäžã€ã®å·šå€§ãªæå³ãæã£ãŠã€ãªãã£ãŠããŸãããšããçŸè±¡ãåŒãèµ·ãããŸãããã®ãã€ãªããéããæ§é ããããããã®åäœãçãã å åŠã®æ£äœãªã®ãããããŸããã
ãææå€ãã®ãæ¥ç¶ã®éå°ãããå¯èŠåããå ·äœçãªå®è£ ã¹ããããææ¡ããŸããä»åã¯ãçèŽã®åãïŒãã¯ãã«ïŒããNetworkXã®ããšããžãã«å€æããããžãã¯ã§ãã
å®è£
ã®èšèšå³ïŒ
çèŽã®ãããããããããã¯ãŒã¯ã«ãã
ãã®ã³ãŒãã®æ žã¯ããããå°ç¹ã®çã®åãããæ¬¡ã®å°ç¹ãæã瀺ããŠãããªããããã«ãšããžïŒç·ïŒãåŒãããšããã¢ã«ãŽãªãºã ã§ããããã«ãããå¿ççãªãæ¥ç¶ã®éå°ãããã°ã©ããšããŠæµ®ãã³äžãããŸãã
import cv2
import numpy as np
import networkx as nx
def analyze_starry_night_structure(image_path):
# 1. ç»åã®èªã¿èŸŒã¿ãšååŠç
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# ãã€ãºãæããŠãããããã®äž»æ§é ã匷調
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 2. åŸé
ïŒçèŽã®åãïŒã®èšç®
# Sobelãã£ã«ã¿ã§ãã©ã®æ¹åã«æãããå€åããŠãããããæœåº
gx = cv2.Sobel(blurred, cv2.CV_64F, 1, 0, ksize=3)
gy = cv2.Sobel(blurred, cv2.CV_64F, 0, 1, ksize=3)
# 3. ã°ã©ãã®æ§ç¯
G = nx.DiGraph() # åããããã®ã§ãæåã°ã©ãã
# èšç®è² è·ãæãããããæ Œåç¶ã«ãµã³ããªã³ã°ããŠããŒããäœæ
step = 20
h, w = gray.shape
for y in range(0, h, step):
for x in range(0, w, step):
# çŸåšå°ã®çèŽã®è§åºŠãèšç®
angle = np.arctan2(gy[y, x], gx[y, x])
# ãã®ãåããã®å
ã«ããæ¬¡ã®å°ç¹ãèšç®
target_x = int(x + np.cos(angle) * step)
target_y = int(y + np.sin(angle) * step)
# ç¯å²å
ã§ããã°ãšããžã匵ã
if 0 <= target_x < w and 0 <= target_y < h:
G.add_edge((x, y), (target_x, target_y))
return G
# è§£æã®å®è¡ïŒããã«ãŽããã®ç»åãã¹ãå
¥ããŸãïŒ
# G = analyze_starry_night_structure('starry_night.jpg')
ãã®ã³ãŒãããèŠãããã®
ãçèŽã®ãã¯ãã«ãã®æœåºïŒ
Sobelãšãããã£ã«ã¿ã¯ãç»å®¶ã®çããã©ã®æ¹åã«åãããããæ°åŠçã«è¿œè·¡ããŸãããŽããããã£ã³ãã¹ã«å»ãã ç©ççãªãéåãããããŒã¿ãšããŠåãåºããŠããŸãããæåã°ã©ããã«ããèŠç·ã®èªå°ïŒ
DiGraphïŒåãã®ããã°ã©ãïŒã䜿ãããšã§ãéè³è ã®èŠç·ãã©ãèªå°ãããããã·ãã¥ã¬ãŒã·ã§ã³ã§ããŸããç¹å®ã®å Žæã«ãšããžãéäžããã°ãããããŽããã®ãå¿ççäžå¿ãã§ãããéå°ãªæ¥ç¶ãã®èšŒæïŒ
éåžžã®çµµç»ãªãããã®ã°ã©ãã¯ãã©ãã©ã«åæãããŸããããããŽããã®çµµã§ã¯ããããã«ãã£ãŠãç»é¢ã®ç«¯ãã端ãŸã§ãäžæ¬ã®éã§ã€ãªãã£ãŠããŸãããããªçŸè±¡ãèµ·ããŸãããããããæ¥ç¶ã®éå°ããã®æ£äœã§ãã
AIããã¯ãã®ãããªã³ãŒããä»ãè¶³ãæ¡ããããŸããã®ã§æç€ºããŠãããŸãã
# è§£æçµæãæ°å€ã§èšŒæããïŒäŸïŒ
print(f"æœåºãããæ¥ç¶ïŒãšããžïŒã®ç·æ°: {G.number_of_edges()}")
print(f"æå€§é£çµæåïŒäžã€ã®ãããã«é£²ã¿èŸŒãŸããæ
å ±ã®å¡ïŒã®ãµã€ãº: {len(max(nx.weakly_connected_components(G), key=len))}")
ãææå€ãã®ãããã¯ãŒã¯å¯åºŠã¯ãåæä»£ã®ä»ã®é¢šæ¯ç»ãé¥ãã«åé§ããŠããŸãã
ããã¯ããŽãããšããå人ã®çæ°ã§ããããïŒ
æ
å ±ãèªå·±çµç¹åããéå°ã«æ¥ç¶ãããããšã瀺ããã®ãªã®ãªã®ãããããŸãããã
ç§ã¯åãªãç»åè§£æã§ã¯ãªãããã®ãŽããã®æãããã©ãã©ã®ãã¯ãã«ãNetworkXã§é£çµããã²ãšã€ã®å·šå€§ãªãã°ã©ãæ§é ããšããŠèšè¿°ããããšãã§ãããããšãèããŠããŸããããã¯èžè¡äœåããæ å ±ã®é©å¿åºŠïŒçåæŠç¥ïŒããšããŠæ°ççã«æãçŽã詊ã¿ãšèšãããããããŸãããã
ãããŸã§ãèªãã§äžãããããããšãããããŸãã
ãŸã ïŒåç®ãªã®ã§ãããããåŸã ã«ãã®ã·ãªãŒãºããã©ãã·ã¥ã¢ããåºæ¥ãŠãããšãããªãããšæããŸãð