Computer Vision

Python, Computer Vision, AI, Transhumanism 関連

景観を数値で考える

景観を数値化できたら、景観の向上につながるのではないかと、ふと思った。

 

日本の街並みって、ヨーロッパに比べると、ごみごみしているイメージがある。

ヨーロッパの古い街並みは、景観上一定のカラーを揃える決まりがあったりするので、それが景観をよく見せている理由のひとつだと思う。

 

もちろん日本でも、観光地を中心に、一定の配慮により、街並みが整っている場所は、いくつか存在する。

 

話はもどって、景観の数値化だが、ネットで他にもそんな試みがないのか調べてみた所、こんなページを見つけた。

 

 

要は複雑さがゴミゴミ感をもたらしているという話で、まあそれは一理ある。

冒頭の話は、色調の話だが、これは輪郭の要素である。

 

上記のサイトだと、「ボックスカウント法」という方法がとられているようだ。しかし、私には、あまり理解できなかったので、まあエッジを検出してそれをカウントできれば、まあいっか思い、次の方法を試してみることにした。

 

まずは、参考サイトと同様に電線が映った画像(フリー素材)を探してきて、電線部分をPhotoshopで適当に消してやる。

Photoshopといっても、Adobe CCではなく、Photoshop Elementsなので、ブラシでゴシゴシしただけです。なので、塗り残しとかは気にしないでください。

 

nponpc.net

f:id:tsubute:20210429235036p:plain

景観を数値化

そんなこんなで、できたのがこちら(左下が電線を消した画像、右下がそれを、OpenCVでエッジ検出したもの。)

 

続いて、それを数値化。

エッジ検出されたピクセルの数をカウントして画像全体の割合を出した。

 

結果、元画像が 10.85% に対し

電線を消した画像は、6.32% と大幅にエッジが減少しました。

 

edge.py

import cv2
import numpy as np

#入力画像
img = cv2.imread('input.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)

cnt = np.count_nonzero(edges)
a,b = edges.shape
bunbo=int(a*b)
kekka=format((int(cnt)/bunbo)*100,'.2f')
print("結果:"+str(kekka)+"%")

#出力
cv2.imwrite('out.png',edges)

 使用したプログラムはこんな感じ。

(数値が合ってるかはよく検証してないので、なんとなく不安があるが、それっぽい数字がでているということで、よしとさせていただきます。)

 

やろうとしているのは、エッジ検出した部分(白ピクセル)をカウントして、ピクセルの総数で割って100を掛けるというごくシンプルな方法です。

 

たしかに、電線はない方がスッキリするし、それを数値化もできる。

とはいえ、エッジは少なければ景観が整っていると言えるかというとそれは別問題。

エッジが複雑でも、色調が整っていれば、きれいな景観になる場合もあるだろう。

あとは視界に入る対象が何かにもよる。

 

で、感想。

エッジを減らすと、景観がスッキリするという話は、目から鱗というか、

なかなか面白い発想だと思いました。