linqで画像処理

36
LINQで画像処理 momo_*(@tututen)

Upload: fumihito-yokoyama

Post on 30-Jun-2015

937 views

Category:

Documents


4 download

DESCRIPTION

CLR/H #74 のLTで発表したもの

TRANSCRIPT

Page 1: Linqで画像処理

LINQで画像処理

momo_*(@tututen)

Page 2: Linqで画像処理

自己紹介

● 某北見市で働く職業プログラマ● 趣味でもプログラム書くことがあります● お仕事:C言語、(Python、C#)● 趣味:ほぼ何でも(※アセンブリを除く)● パネルでポン(以下、パネポン)ができます● タグ「友達がいないとこうなります」で検索!● あと、手元を映したUst動画もあったりします

Page 3: Linqで画像処理

地図

Page 4: Linqで画像処理

地図

Page 5: Linqで画像処理

自己紹介

● 某北見市で働く職業プログラマ● 趣味でもプログラム書くことがあります● お仕事:C言語、(Python、C#)● 趣味:ほぼ何でも(※アセンブリを除く)● パネルでポン(以下、パネポン)ができます● タグ「友達がいないとこうなります」で検索!● あと、手元を映したUst動画もあったりします

Page 6: Linqで画像処理

検索結果

Page 7: Linqで画像処理

最近のタグ(7/7 13:00現在)

Page 8: Linqで画像処理

Ust風景

http://www.ustream.tv/recorded/20923039

Page 9: Linqで画像処理

LINQについて

Language Integrated Query の略称で、 C# や VB

などの .NET Framework 対応言語に、 リレーショナルデータや XML に対するデータ操作構文を組み込む (+ データベースや XML 操作用のライブラリ)

引用:http://ufcpp.net/study/csharp/sp3_linq.html

Page 10: Linqで画像処理

LINQについて

0 1 2

1098

7654

3

11

141312 15

0 2

8

64

1412

10Where(p => p % 2 == 0)

Page 11: Linqで画像処理

LINQについて

Select(p => p.ToString())

0 2

8

64

1412

10

"0" "2"

"8"

"6""4"

"14""12"

"10"

Page 12: Linqで画像処理

今回の説明する機能

Page 13: Linqで画像処理

今回の説明する機能

Page 14: Linqで画像処理

画像処理の主な手順

● 画像をグレースケール(モノクロ)化● 画像を二値化● テンプレート画像とのマッチング

Page 15: Linqで画像処理

グレースケール(モノクロ)化

● 中間値法● NTSC系加重平均法

(NTSC=National Television System Commitee(全米テレビジョン放送標準化委員会))

Page 16: Linqで画像処理

R * 0.298912 + G * 0.586611 + B * 0.114478

グレースケール(モノクロ)化

● 中間値法● NTSC系加重平均法

(NTSC=National Television System Commitee(全米テレビジョン放送装標準化委員会)) 

Page 17: Linqで画像処理

グレースケール(モノクロ)化

※画像はイメージです!

Page 18: Linqで画像処理

二値化

● 各画素の値を取る● しきい値によって「0」or「255」を設定するだけ

※画像はイメージです!

Page 19: Linqで画像処理

LINQ的にどう書く?

1. 画像を画素のシーケンシャルに変換2. 各画素に対してグレースケール化3. グレースケールした画素に対して、二値化

Page 20: Linqで画像処理

LockBits1. Bitmap型のデータをByte配列にする2. 画像のフォーマットによって、1画素の情報が違

う3. PixelFormat.Format32bppArgbの場合byte[4]

に1画素の情報が入り、1byteごとにBlue、Green、Red、Alphaのデータが入る。

Page 21: Linqで画像処理

LockBits

Page 22: Linqで画像処理

各画素をグレースケール化

1. [0 .. 画像サイズ*4byte分]のシーケンシャルデータを生成

2. 4の倍数のシーケンシャルデータにフィルタ3. NTSC系加重平均法の公式を当てはめる

Page 23: Linqで画像処理

各画素をグレースケール化

Enumerable.Range(0, bmp.Width * bmp.Height * 4) // 1

Page 24: Linqで画像処理

各画素をグレースケール化

Enumerable.Range(0, bmp.Width * bmp.Height * 4) // 1 .Where(p => p % 4 == 0) // 2

Page 25: Linqで画像処理

各画素をグレースケール化

Enumerable.Range(0, bmp.Width * bmp.Height * 4) // 1 .Where(p => p % 4 == 0) // 2 .AsParallel() // 並列化 .ForAll(p => { double cr = 0.298912, cg = ..., cb = ...; byte g = (byte)(cr * ba[i + 0] + cg * ba[i + 1] + cb * ba[i + 2]) ba[i + 0] = ba[i + 1] = ba[i + 2] = g; });

Page 26: Linqで画像処理

各画素を二値化

Enumerable.Range(0, bmp.Width * bmp.Height * 4) // 1 .Where(p => p % 4 == 0) // 2 .AsParallel() // 並列化 .ForAll(p => { double cr = 0.298912, cg = ..., cb = ...; byte g = (byte)(cr * ba[i + 0] + cg * ba[i + 1] + cb * ba[i + 2]) ba[i + 0] = ba[i + 1] = ba[i + 2] = g < th ? 0 : 255; });

Page 27: Linqで画像処理

テンプレート画像でマッチング

● 空白・数字「1−9」までのテンプレート画像を用意

● 上記のテンプレート画像を二値化した画像と、マスの画像を二値化した画像を比較

● 比較結果が最も似ているものをその数値と断定する。

37

370

Page 28: Linqで画像処理

テンプレート画像でマッチング

Enumerable.Range(0, 10) // 1

Page 29: Linqで画像処理

テンプレート画像でマッチング

Enumerable.Range(0, 10) // 1 .Select((p, i) => new {

})

Page 30: Linqで画像処理

テンプレート画像でマッチング

Enumerable.Range(0, 10) // 1 .Select((p, i) => new { Num = i, })

Page 31: Linqで画像処理

テンプレート画像でマッチング

Enumerable.Range(0, 10) // 1 .Select((p, i) => new { Num = i, Count = Enumerable.Range(0, 37 * 37) .Count( q => CellImgByte[q] == TmplImgByte[i * 37 + q % 37 + q / 37 + i * 370] ) // 2 })

Page 32: Linqで画像処理

テンプレート画像でマッチング

Enumerable.Range(0, 10) // 1 .Select((p, i) => new { Num = i, Count = Enumerable.Range(0, 37 * 37) .Count( q => CellImgByte[q] == TmplImgByte[i * 37 + q % 37 + q / 37 + i * 370] ) // 2 }) .OrderByDescending( p => p.Count )

Page 33: Linqで画像処理

テンプレート画像でマッチング

Enumerable.Range(0, 10) // 1 .Select((p, i) => new { Num = i, Count = Enumerable.Range(0, 37 * 37) .Count( q => CellImgByte[q] == TmplImgByte[i * 37 + q % 37 + q / 37 + i * 370] ) // 2 }) .OrderByDescending( p => p.Count ) .First()

Page 34: Linqで画像処理

テンプレート画像でマッチング

Enumerable.Range(0, 10) // 1 .Select((p, i) => new { Num = i, Count = Enumerable.Range(0, 37 * 37) .Count( q => CellImgByte[q] == TmplImgByte[i * 37 + q % 37 + q / 37 + i * 370] ) // 2 }) .OrderByDescending( p => p.Count ) .First() .Num; // 3

Page 35: Linqで画像処理

まとめ

● 各画素に対して行う画像処理とLINQの相性はばっちし!

● 今日からあなたもわたしもLINQ!LINQ!

Page 36: Linqで画像処理

ご清聴ありがとうございました