画像のヒストグラムの中央値を求める

Photoshop/Photoshop Elementsで画像のヒストグラムを求めた結果から、その中央値を求めるAppleScriptです。

ヒストグラムという言葉の定義を考えると、「度数分布を表した柱状グラフ」ということになるわけですが……このままだとピンと来ないので、Photoshop上のヒストグラムについて具体的にいえば、「画像の明度を256段階に分けて、それぞれの明度に該当するドット数をカウントしてグラフ化したもの」です。

その中央値を求めるということは、画像中の明度分布の平均値がどのあたりにあるか算出するための試みを行うというわけで、画像のレベル自動変更といった処理をにらんで作ってみました。

ここで用いたサンプル画像だと、中央値がレベル140ということなので、

hist1.jpg

こんな感じです。なんとなく、こんな感じかといわれればこんな感じなのですが、この中央値をもってサンプル画像が明るいか暗いかは判断つきかねるところです。

hist2.jpg

実際、この中央値が140の画像はちょっと暗めのものだったので……中央値を求めてもこの用途には使えなさそうです。何か別の用途には使えるかもしれません。

画像の自動レベル補正については、PhotoshopのAppleScript用語辞書にadjustコマンドが用意されており、

スクリプト名:Photoshop CS3で画像の明度レベル自動補正
tell application “Adobe Photoshop CS3″
  tell document 1
    tell art layer 1
      adjust using automatic levels
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

このぐらいでさくっと実行できるのですが、Photoshopの自動補正程度ではぜんぜん役立ちません。

別途、レベル自動補正のための処理を考え、そちらで実現した次第です。

スクリプト名:ヒストグラムの中央値を求める
set bList to {8, 110, 232, 314, 388, 401, 516, 730, 832, 737, 667, 832, 1097, 1478, 1668, 1454, 872, 670, 505, 444, 437, 395, 318, 340, 335, 400, 445, 498, 527, 570, 620, 681, 713, 766, 801, 835, 856, 972, 1139, 1311, 1412, 1153, 969, 955, 909, 839, 859, 975, 1003, 1087, 1001, 948, 911, 1018, 1120, 1067, 1131, 1092, 1139, 1119, 1036, 1037, 970, 980, 916, 889, 807, 831, 809, 822, 817, 799, 882, 828, 932, 848, 910, 1018, 1112, 1223, 1449, 1646, 1891, 1925, 2141, 2978, 4092, 4816, 4368, 3673, 2876, 1964, 1610, 1420, 1478, 1386, 1328, 1207, 1247, 1298, 1261, 1250, 1354, 1475, 1361, 1409, 1766, 2476, 3686, 5015, 6218, 6639, 6322, 6007, 6414, 7525, 8596, 9065, 9560, 11121, 11976, 11515, 11668, 12823, 14802, 16467, 18105, 21367, 25910, 27244, 25368, 24587, 24538, 23670, 21556, 21098, 24165, 26423, 24957, 22997, 23679, 24743, 23797, 21897, 22037, 22317, 21025, 18623, 18966, 19382, 18671, 16789, 15486, 16482, 17025, 15849, 14893, 16760, 18356, 17653, 14952, 14055, 14657, 14746, 14015, 14080, 14864, 15049, 13967, 11706, 11014, 9662, 8178, 6149, 5889, 5296, 4059, 3136, 2813, 2136, 1236, 711, 581, 510, 468, 436, 457, 388, 435, 355, 385, 398, 373, 361, 333, 372, 355, 338, 287, 296, 295, 327, 270, 296, 262, 245, 240, 250, 210, 231, 222, 245, 230, 243, 249, 223, 204, 232, 225, 257, 248, 228, 260, 252, 219, 255, 283, 302, 274, 270, 343, 353, 325, 338, 401, 435, 509, 503, 497, 576, 581, 553, 476, 345, 224, 110, 59, 26, 13, 15, 7, 0, 0, 0, 0, 0}

–リスト要素の合計を計算する
set iCount to 0
repeat with i in bList
  set iCount to iCount + i
end repeat
set halfVal to iCount div 2 –画像の全画素のドット数で数えて中央の要素を計算(何個目のドットが中央か)

–ドット個数の中央値を超える要素をループで検出する
set iiCount to 0
set iiCounter to 1
repeat with i in bList
  set iiCount to iiCount + i
  
if iiCount is not less than halfVal then
    exit repeat
  end if
  
set iiCounter to iiCounter + 1
end repeat

iiCounter –暗いドットから明るいドットまですべて順番に並べて、個数的に真ん中のものの明るさが求められる
–> 140

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

Leave a Reply