猫も杓子も構造化

発達障害、特別支援などについて書いています。最近は心理学関係の内容が多めです。

Python版OpenCVによるpng画像と透過処理について

必要があって画像処理の技術に入門している。その覚書。

f:id:nekomosyakushimo:20171115120827p:plain
(出所:いらすとや)

このタヌキが今回の実験台である。かわいい。

opencvを使って画像を読み込む際はimreadを使う。

# coding:utf-8

import cv2
import numpy as np

src = "test.png"

img = cv2.imread(src, 0)

第1引数にファイル、第2引数には読み込みのオプションを指定する。0だとグレースケール、1だとカラー、-1だとアルファチャンネル等の追加のチャンネルを含んだまま読み込むらしい。読み込まれた画像はndarray、つまりN次元の配列データとして扱われる。

各次元の要素数を調べるためにnumpy.shapeのメソッドを使うと読み込みによって得られる配列の違いが分かる。

f:id:nekomosyakushimo:20171115121303p:plain

グレースケールだと2次元の配列として行列が得られる。カラーだと3次元の配列として色情報次元のデータもRGBで得られるが、追加チャンネルを含んだ読み込みだとこの次元の要素数が一つ増える。この場合では、不透明度を決定する4つ目の要素が得られる。(RGBA)

このような形で配列情報を得ると特定の画素値にアクセスすることも可能である。例えば、上から100ピクセル目、左から100ピクセル目の画素値へアクセスすると以下のようになる。

f:id:nekomosyakushimo:20171115122239p:plain

グレースケールでは、画素値は0を最小値、255を最大値とする値が一つ格納されている、カラーだとRGBの画素値が、追加チャンネル込みだと、そこにアルファチャンネルを追加した値が得られる。

ちなみにアルファチャンネルは0から255までの値をとりうるようで、0だと透明、255だと完全な不透明になる。ここの数字を変えると透明度合いをいじることができる。例えば、先ほどの画像を半透明にするには、すべての画素のアルファチャンネルに真ん中ぐらいの128の数字を代入すれば良い。

newimg = img3
newimg[:, :, 3] = 128

結果の画像は次の通り。

f:id:nekomosyakushimo:20171115134840p:plain

もともと透明だった背景の黒が透明じゃなくなり、透明でなかったタヌキが半透明化している。

今度は、タヌキの部分だけ半透明にしたい場合を考える。タヌキの部分の画素のインデックスを取得することができれば、今と同じ手順でアルファチャンネルをいじることができる。そこで、条件を満たす要素のインデックスを取得するnp.whereというものを使って、中身のインデックスを取得して、中身のアルファチャンネルのみ変更をする。

newimg2 = img3
hutomei = np.where(img3[:, :, 3] != 0)  #アルファチャンネルが透明でないインデックスを取得
three = np.ones((len(hutomei[1])), dtype="int8") * 3  # 3だけからなる配列を作成
index = tuple((hutomei[0], hutomei[1], three))  #合わせたインデックスを作成 
newimg2[index] = 128

なんか無駄が多いコードな気がするのだが、とりあえず試行錯誤の結果うまくいったのでよしとする。結果の出力画像は以下の通り。

f:id:nekomosyakushimo:20171115143940p:plain

背景は完全に透明なまま、中身のタヌキだけが無事に半透明化した。背景は画面上では白く見えているかもしれないが、画素値にアクセスするとさきほどまでの画像と同じように黒である。

【参考】

OpenCVによる画像処理入門 改訂第2版 (KS情報科学専門書)

OpenCVによる画像処理入門 改訂第2版 (KS情報科学専門書)

今まで読んできた統計本・数学本

今年は統計ネタの記事が多くなってきたので、記事を描く際に参考にしている本をまとめて紹介します。数学本も一緒に紹介するのは、統計関連の本を読む際に、数学が全然分からなくて勉強しなおした関係です。ただ並べるだけだとあれなので主観的なオススメ度合い(★3つで評価)と一言コメントを書いておきます(本当はしっかりとレビューを書こうと思ったのですがたくさんあって面倒+全部読みきっていなかったり、理解が半端だったりするのもあるので)。本の難易度は、基本的に後ろにいくほど難しいです。

統計本関係

推計学のすすめ―決定と計画の科学 (ブルーバックス)

推計学のすすめ―決定と計画の科学 (ブルーバックス)

★★★ 統計的な考え方の説明に重点。古い本だけど超良書。


完全独習 統計学入門

完全独習 統計学入門

★★ 確率をなるべく使わないという斬新な試み。分布の導出とかが結構丁寧。


Rによるやさしい統計学

Rによるやさしい統計学

★★ Rと統計どちらにも入門したい人には大変おすすめ。


心理統計学の基礎―統合的理解のために (有斐閣アルマ)

心理統計学の基礎―統合的理解のために (有斐閣アルマ)

★★★ 数式の展開とか丁寧。トータルで見てとてもバランスが良い。


心理統計学ワークブック―理解の確認と深化のために

心理統計学ワークブック―理解の確認と深化のために

★★ 実際に手を動かすと分かっていない部分が多くてびっくりする。ホントにびっくりする。


基本統計学 第4版

基本統計学 第4版

★★★ 数式の展開とか丁寧。確率とか基本の考え方に重きを置いている。


キーポイント確率統計 (理工系数学のキーポイント 6)

キーポイント確率統計 (理工系数学のキーポイント 6)

★★ 理系の人向けって感じでスッキリとした説明。著者のよくわからないギャグが随所に入っていて個人的にはお気に入り。


統計学入門 (基礎統計学?)

統計学入門 (基礎統計学?)

★★ 確率分布のあたりで急に難しくなる。説明が簡素。


★★ 基礎的な事項をより多面的に理解できる。分布間の関係の箇所を読んでかなり見通しが良くなった。


多変量解析法入門 (ライブラリ新数学大系)

多変量解析法入門 (ライブラリ新数学大系)

★★ 式の展開とか色分けされており分かりやすい。


心理学のためのデータ解析テクニカルブック

心理学のためのデータ解析テクニカルブック

★ 分析の際の疑問点とか実際的場面でのレファレンスとして。


Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによるデータサイエンス データ解析の基礎から最新手法まで

★ データ解析の手法の紹介。本当に色々な手法が乗っている。

数学本関係

数学入門〈上〉 (岩波新書)

数学入門〈上〉 (岩波新書)

数学入門〈下〉 (岩波新書 青版 396)

数学入門〈下〉 (岩波新書 青版 396)

★★ 数学の不思議さや魅力の紹介。数の拡張の歴史が学べる。教養として面白い。


統計学のための数学教室

統計学のための数学教室

★ 統計に必要なところだけ復習していくスタイル。数学と統計のつながりが学べる。


もう一度高校数学

もう一度高校数学

★★ 高校数学の内容が1冊にまとまっており便利。謎の語りかけ口調はややうっとおしい。


微分・積分30講 (数学30講シリーズ)

微分・積分30講 (数学30講シリーズ)

線形代数30講 (数学30講シリーズ)

線形代数30講 (数学30講シリーズ)

★★ 高校数学と大学初年度の数学の間のあたり。1講1講が短く取り組みやすい。


ゼロから学ぶ微分積分 (KS自然科学書ピ-ス)

ゼロから学ぶ微分積分 (KS自然科学書ピ-ス)

ゼロから学ぶ線形代数 (KS自然科学書ピ-ス)

ゼロから学ぶ線形代数 (KS自然科学書ピ-ス)

★★ イメージ重視。数学の魅力を伝えようという著者の書き方が良い。


キーポイント微分方程式 (理工系数学のキーポイント 5)

キーポイント微分方程式 (理工系数学のキーポイント 5)

★ とっつきづらい内容を平易な例で親しみやすく解説している。

バイク用ブーツカバーを買ってみた

ここのところ雨が多かった。わたしは平日はほぼ毎日バイクに乗る必要がある。となると防水対策をしないとQOLの低下は免れない。

ワークマンで昔買ったレインウェアはまだ防水性能を保っている。しかし、防水だったはずの靴に関してはもはやその機能が失われているようで、雨の日にバイクに乗るたびに中まで完全に浸水する。

毎日続く雨にかなりやられたので、これはいよいよ本格的に防水対策をしなければと思いブーツカバーたるものを導入してみた。

とりあえず、Amazonで安くて手頃なものにしたが、これはだいぶ快適である。装着もそこまで手間でないしハーフソールだから滑ったりもしない。

ただ、レインウェアの裾が短いとハイカットがウェアまで届かずに、すねのあたりから靴下を伝って浸水してくる。裾が長めのウェアと合わせて使うか、裾が短いウェアを使っている人はスネまで覆えるより高さのあるブーツカバーを導入すると良いと思う。

ともあれ、雨の日のバイクがだいぶ快適なったので値段の割には良い買い物だった気がする。あとは、この撥水と防水の機能がいつまで続くかが気になるところである。

川上康則編『通常学級でできる発達障害のある子の学習支援』

久々に臨床的なものの紹介でも。オールカラーでイラストたっぷりで薄い。モノクロでイラストなしでいいから半分ぐらいの値段にならなかったのだろうか、というのが初めに読んだ時の感想(笑)

内容としてはほぼタイトル通りで、小学校の通常学級内で学習につまづきがある児童・生徒への支援の事例が14例紹介されている。どの事例に対しても支援の方針として、行動の背景にある要因に注目すること、クラスワイドで学級への支援や授業の組み立てを考えることを基本としている。

各事例は、こどもの典型的なつまずきのケースが紹介され、まずその場で出来る対応および子供のふるまいをみとる視点が紹介されている。その後、氷山モデルを用いてつまずきの背景となる要因が説明されたあと、クラス全体にできる支援、個に応じてできる支援、長期的な視野での発達的(あるいは治療的)支援等が紹介されている。事例および支援は見開き3ページで収まるようになっており、コンパクトにまとまっている。

通常級での学習支援をテーマとした本なので、個を詳しく見るよりも、クラスの雰囲気づくりなどの学級経営的な側面への対応が書かれており、特別支援教育コーディネーターや指導主事、主幹教諭など学級へのコンサルテーションを行う立場の人が読むと得るものがあると思う。

本書で紹介される事例は以下の通り。

  1. 授業への集中が続かず違うことをする
  2. 不注意なまちがいが多い
  3. 音読がうまくできない
  4. 説明文を読み理解するのがむずかしい
  5. 中心人物の気持ちの変化の読み取りが苦手
  6. 文字を覚えられない、形がととのわない
  7. 感じが書けない、まちがいが多い
  8. 作文が苦手で書くのをいやがる
  9. 繰り上がり・繰り下がりの計算ができない
  10. 割り算ができない
  11. 文章題になるとわからない
  12. 図形の問題がわからない
  13. 不器用なため学習が進みにくい
  14. 体育の時間が嫌い

気になったことだが、編者の名前があるのに著者の情報が無いこういう本は、出版社の人が何かを参考に資料をまとめて、それを編者がチェックしてゴーサインを出すみたいな作られ方をしているのだろうか。

学びのUDLについてのアレコレ

学びのUDLという言葉がある。これはUniversal Design for Learning の訳語で、その意味するところを簡単に書くなら、平均的な学習者を対象とする融通の利かないカリキュラムで教えるのでなく、学習者に適した学び方は多様であるという前提にたち、カリキュラムに柔軟性を持たせて多様な学び方をカリキュラム内に組み込もうという考え方だと言える。

UDLはアメリカの教育関係の機関であるCASTというところが提唱していて、そこからガイドラインなどが出されている。

http://www.udlcenter.org/sites/udlcenter.org/files/UDL_Guidelines_2%200_Japanese_final%20(1).pdf

ざっと入門したい人は日本のUDL研究会というところが作った次の資料が役に立つ。

http://udl-japan.up.seesaa.net/image/UDLE383AAE383BCE38395E383ACE38383E38388E9858DE5B883E794A8.pdf

資料を読みながら、日本の教育事情(とりわけ通常学級)を考えた際にこの考え方はどの程度適用できるのかについて考えていた。UDLの考えを採用すると、例えば一つの国語の授業時間内で児童・生徒によって別の学習活動が展開されることになる。学び方を多様化させる訳だから当たり前の話である。そうなると「授業」という枠組みが大きく意味を変えるように思う。そもそも、同じ内容を同じように学ぶからこそ、同じ時間、同じ空間に「授業」という場を設定していたのである。その前提がなくなったのであれば、学ぶための枠組みは「授業」に限定する必要がなくなるように思うのだ。それぞれが別の学習活動に従事するのであれば、それは別の時間、別の空間で行われても一向に構わないはずであるし、そちらの方が柔軟な学び方が提供されるように思う。UDLの考え方を突き進めていくと、学び自体を個別化していく方向性が見えてくる。

とはいえ、現在の学校の諸制度はそのようにデザインされている訳ではないので、現実的な落とし所として、授業内に学びのUDLの考え方(あるいはエッセンスや工夫?)を取り入れてみましょうというのが現状だろうか。あるいは、そうした現実的な制約を超えて、「同じ場」で多様な学び方を行なう必然性が存在しているのだろうか(資料からはそのような記述は見つからなかったが)。

書きながら、特別支援学校に勤務していた時の生活単元の授業のことについて思い出した。遠足の事前学習の授業で、言葉がある生徒には口頭の発表を求めていたが、言葉がない生徒が発表するときにはイラストをホワイトボードに貼るなどの発表方法をとっていた(その分準備物は多かったが)。認知的にも大きな差がある生徒を集団で授業するための苦肉の策であったような気がするが、表出のために多様な表現方法を認めているという点では学びのUDL的である。しかし、この場合にも「なんで集団でこの授業をするの」という問いに対する決定的な答えはなかったように思う。集団で授業を行う理由は、教員の準備の分担や教室の数などの現実的な制約によるものだったのだと考えている。

資料を読んでいて気になった点のもう一つに、学びのUDLの根拠としている内容がある。ガイドラインには、基盤となる研究としていくつかの研究者の名前を挙げたあとに次のように書いてある。

ヴィゴツキーは UDLカリキュラムのキーポイントである、段階的な“足場”(※)の重要性を強調しています。これは、初心者だけではなく、高度な技能を習得する際にも、上達に応じて少しずつ外していくことができるという点で重要です。段階的に外していける足場(段階的支援)の考え方は、人類の文化と同じぐらい古いもので、歩くことや自転車に“補助なし”で乗ることを学ぶことから始まり、神経手術やパイロット養成の長期研修期間まで、ほぼあらゆる分野の学習に適用できるものです。(pp13-14)

これを読みながら、ヴィゴツキーの言っていた心的機能の社会的起源(social origin)というのが見事に換骨奪胎されて、援助がはずれていくその過程のみが抽出されているなぁということを感じた。精神間(interpsychic)だとか精神内(intrapsychic)だとか内化(internalization)などはまるで姿を消している。基礎となる研究が別の応用的な研究に取り上げられるときに、もともとあった意味を失い単純化されていくというのは往々にして起きうることだが、そのもともと意味していた内容に時折思いを馳せるようにしたい。



まなびのUDLをちゃんと学ぶならここら辺の書籍ですかね。

The Universally Designed Classroom: Accessible Curriculum And Digital Technologies

The Universally Designed Classroom: Accessible Curriculum And Digital Technologies

A Practical Reader in Universal Design for Learning

A Practical Reader in Universal Design for Learning

Pythonでお絵かき(エビングハウス錯視編)

以前にPythonでカフェウォール錯視の画像を作った。

nekomosyakushimo.hatenablog.com

今回はカフェウォール錯視に続いてもう少し複雑な感じのお絵かきを試みる。錯視界隈では有名なエビングハウス錯視でいってみよう。

エビングハウスが何だか分からない人はWikipediaを見るとよいでしょう。おそらく1度や2度は見たことがあるはず。

エビングハウス錯視 - Wikipedia

今回のポイントは中心円を囲む外側の円の位置情報である。三角関数を用いてxとy座標を求めるのだが、Python三角関数を使う際には、ライブラリのmathやnumpyが必要になる。今回は行列の処理が必要だったのでnumpyを使っている。

# 左の外円の位置情報
x = [0, 60, 120, 180, 240, 300]
x1 = np.radians(x)  # 弧度法に変換
x2 = np.cos(x1)  # コサインを計算
x3 = x2 * 120  # 外円の作る円の半径をかける
y2 = np.sin(x1)  # サインを計算
y3 = y2 * 120
pos1 = np.c_[x3, y3] + center1


考え方としては、中心円を囲む大きな円があるとして、三角関数を使ってその円周上の座標を求めている。Pythonでsinやcosの計算をする際には、弧度法で値を与えないといけないそうなので、radians()という関数で変換をしてから計算し、大きな円の半径をかけて中心円からの距離を求めている。最後のnp.c_()は、配列を列方向に結合する関数で、こうすることで[x座様, y座標]が6つからなる6×2の行列を得ることができる。

ここで得られた座標は外円の中心点の座標なので、円を描く際にはその座標から外側の円の半径を引いたものと足したものを用意してやれば良い。

完成品が次のもの。色はWikipediaに準じた。

f:id:nekomosyakushimo:20170906011955p:plain


使用したコードは次の通り。

# coding:utf-8
from __future__ import division
from __future__ import unicode_literals
import numpy as np
from PIL import Image
from PIL import ImageDraw

# 描画オブジェクトとか
image = Image.new("RGB", (640, 320), color=(255, 255, 255))
draw = ImageDraw.Draw(image)

# もろもろの情報
center1 = np.array([200, 160])
center2 = np.array([500, 160])
rad1 = 30
rad2 = 50
rad3 = 15

# 左の外円の位置情報
x = [0, 60, 120, 180, 240, 300]
x1 = np.radians(x)  # 弧度法に変換
x2 = np.cos(x1)  # コサインを計算
x3 = x2 * 120  # 外円の作る円の半径をかける
y2 = np.sin(x1)  # サインを計算
y3 = y2 * 120
pos1 = np.c_[x3, y3] + center1

#  右の外円の位置情報
a = [0, 45, 90, 135, 180, 225, 270, 315]
a1 = np.radians(a)
a2 = np.cos(a1)
a3 = a2 * 60
b2 = np.sin(a1)
b3 = b2 * 60
pos2 = np.c_[a3, b3] + center2

#中心の円を描画
draw.ellipse(((tuple(center1 - rad1)), (tuple(center1 + rad1))),
             fill=(228, 127, 66), outline=None)
draw.ellipse(((tuple(center2 - rad1)), (tuple(center2 + rad1))),
             fill=(228, 127, 66), outline=None)

#  左側周りの大きな円を描画
for i in range(6):
    draw.ellipse(((tuple(pos1[i] - rad2)), (tuple(pos1[i] + rad2))),
                 fill=(146, 164, 184), outline=None)

#  右側周りの小さな円を描画
for i in range(8):
    draw.ellipse(((tuple(pos2[i] - rad3)), (tuple(pos2[i] + rad3))),
                 fill=(146, 164, 184), outline=None)

image.save("ebbing.png")

世論調査と誤差

NHK世論調査で各党の支持率が公表されていた。

www3.nhk.or.jp

NHKのサイトによれば、NHK世論調査の標本サイズは3600人だそうである。

世論調査の手順 - 調査相手の抽出 | NHK放送文化研究所

3600人の抽出調査に対して誤差の範囲が次のように紹介されている。

回答 5/95% 10/90% 20/80% 30/70% 40/60% 50%
誤差 ±0.7% ±1.0% ±1.3% ±1.5% ±1.6% ±1.7%

この誤差がいったいどういう理屈で計算されているかというと、以前の記事で書いた信頼係数95%における比率の誤差の計算式

   \displaystyle n = \left( \frac{1.96}{E} \right)^2 p(1-p)

から計算することができる。

nekomosyakushimo.hatenablog.com


試しに、nに3600を代入して本当にNHKのサイト通りになるのかを確認してみよう。p=0.5(回答が50%)の場合、

   \displaystyle 3600 = \left( \frac{1.96}{E} \right)^2 0.5(1-0.5)

   \displaystyle 3600 = \left( \frac{1.96}{E} \right)^2 0.25

   \displaystyle 14400 = \left( \frac{1.96}{E} \right)^2

   \displaystyle \pm120 = \frac{1.96}{E}

   \displaystyle \pm E = \frac{1.96}{120}

となり、マイナスの場合は考えなくて良いので

   \displaystyle E = \frac{1.96}{120} = 0.0163333

が得られる。有効数字2桁になるように切り上げれば、母集団比率が50%であるときの誤差は1.7%程度ということである。つまり、NHKのサイトに載っている誤差とは、同じ抽出を繰り返した際に95%の確率で母集団からの誤差がその範囲に収まる値である。逆に言えば5%の確率で、1.7%以上の誤差も起きるということだ。

最初の方で紹介した誤差の表を見ていただけると分かるが、母集団比率がけっこう偏っていようが、1%程度の誤差はあるということである。そのことを鑑みると、世論調査で出てきた政党支持率のうち、差が1%に満たないようなもの(例えば、今回の希望の党立憲民主党の0.4%の差)は抽出における誤差の可能性を十分に考慮して見る必要があるだろう。

と、ここまで書いてきたのだけれどよくよく調べたら、月齢政治意識調査は電話調査であって上記紹介のものよりも少し小さいサンプルサイズであった。

政治意識月例調査|NHK放送文化研究所

今回の場合は、得た有効回答数が3119人だそうなので少しだけ誤差が大きくなりますかね。あと、上記の計算は回答率を全く考慮していないので(あくまで統計学的に誤差がどうなるかの計算なので)現実の結果解釈はより難しい話になりますね。