Julia でヒストグラム2016年02月02日 19:30

話は前後するが、Julia でヒストグラム表示をやってみたのでメモ

イメージの読み出しが load() になった。読み出すと Image 構造体に読み込まれるので、その中から data() で画像データのみを取り出す。取り出した data は、RGB 構造体の配列なので、reinterpret () で UInt8 の配列に変換する。これで、3 x 横 x 縦 サイズの UInt8 の配列に取り出せる。
さらに、RGB に分離する。前記 UInt8 配列のうち、1次元目はR/G/B をあらわしているので、R のみ取り出すには [1,:,:] を指定する。このままでは3次元の配列なので2次元にするために、先頭の次元を squeze で削除する。これでやっと2次元の R が取り出せる。(結構面倒くさい)

続いてヒストグラム生成。2次元のままだと(所望の)ヒストグラムが取れないので、reshape で1次元に並び替える。squeeze とは違うので注意(前述の次元削除も reshape で出来ないこともないけど)。
これでやっとヒストグラムが取れる。hist(v, e) の書式で、v はヒストグラムを取るベクトル(1次元の配列)。e は幅指定で、-1:255 で 0から255の範囲をヒストグラム化。1番目の範囲は、-1より大きく、0以下。255番目の範囲は245より大きく、255以下が含まれる。
ちなみに、-1:16:255 でヒストグラムの幅を16ずつとかに出来る。edge と 分布が返ってくる。

ヒストグラムが出来たので、グラフに描いてみる。ここでは、描画パッケージとして Winston を使用。
Histogram() でグラフのオブジェクトを作成、FramedPlot() は、描画用のウィンドウの作成。add() で、ウィンドウにグラフオブジェクトを追加。これでヒストグラムが表示される。

やってみてわかったのだが、UInt8 のまま hist() を呼ぶと動作がおかしい。* 1.0 で Float64 に変換しているのはそのため。理由は不明・・・
UInt8 のままで画像処理をするといろいろ面倒なので、最初に RGB 変換時に Float に変換したほうがいいかも知れない。

# image 読み込み
using Images
img= reinterpret(UInt8,data(load("SleepingCat.bmp")))
red  = squeeze(img[1,:,:], 1)
green= squeeze(img[2,:,:], 1)
blue = squeeze(img[3,:,:], 1)

# Histogram 生成
data1d= reshape(green, length(green)) * 1.0
(edges, counts)= hist(data1d, -1:255)

# Winston の機能
using Winston
h= Histogram(edges, counts)
p= FramedPlot()
add(p, h)

コメント

_ chocolate ― 2018年05月02日 17:02

I was wondering if you ever thought of changing the page layout of your site?
Its very well written

_ choc ― 2018年05月04日 05:04

I think the admin of this web site is actually working hard in favor of his website, as here every data
is quality based information.

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://marusu.asablo.jp/blog/2016/02/02/8007232/tb