improc

自然画像中の方位の分布の解析

人間は水平・垂直な方向の線分に対して感度が高いことが知られており、これは Oblique effect と呼ばれます。人間が生活する視環境の中に水平・垂直の成分が多く含まれることがこのような視覚特性をもたらしているという可能性が指摘されています(Coppola et al., 1998)。

Coppolaらは風景画像を分析し、屋内や屋外など建築物のある風景だけでなく、人工物の無い自然風景においても水平・垂直な方位成分が多く含まれることを示しました。

Coppolaらが行った分析を R と imager を用いて再現してみましょう。

library( imager )
library( dplyr )
library( ggplot2 )

# prepare an image
img = load.image( "img/scene.png" )
img = imappend( list( R(img), G(img), B(img) ), axis = "c" )%>%
  grayscale() %>% imresize( scale = .5 ) %>% isoblur( 2 )

# calculate edge magnitudes and angles
gradients = imgradient( img, "xy", scheme = 2 )
magnitude = sqrt( gradients$x^2 + gradients$y^2 )
angle = atan2( gradients$y, gradients$x )
angleDeg = round( ( angle + pi ) * 180 / pi )

plot( imlist(
  input = img, Magnitude = magnitude, Angle = angleDeg ), layout = "row" )

# calculate the distribution of edge orientation
dm = data.frame( angle = as.vector( angleDeg ), magnitude = as.vector( magnitude ) ) %>%
  dplyr::group_by( angle ) %>% dplyr::summarise( sum = sum( magnitude ) )
fig = ggplot( dm, aes( x = angle, y = sum ) ) + 
  geom_bar( stat = "identity", width = 1 ) +
  scale_x_continuous( limits = c( 0, 360 ), breaks = 0:360*90 )
plot( fig )

この例では画像を1枚だけ分析していますが(Coppolaらはカテゴリごとに大量の画像を分析してその平均を出しています)、それでも方位の分布に確かに偏りがあることが確認できます(Coppolaらの図では 0, 180度が水平、90, 270度が垂直を意味しますが、このスクリプトでは0, 180度が垂直、90, 270度が水平を意味します)。

コメント

  1. yoshi says:

    90と270度の違いを教えていただけないでしょうか。どうぞよろしくお願いします。

    • tsuda says:

      エッジの方向の違いです。エッジには「黒から白へ変化するエッジ」と「白から黒へ変化するエッジ」の2種類があるので、同じ水平エッジでも90度と270度の2種類があることになります(水平だけでなく任意の角度で同じことが言えます)。

Copied title and URL