20150909卒研進捗LT

29

Transcript of 20150909卒研進捗LT

Page 1: 20150909卒研進捗LT
Page 2: 20150909卒研進捗LT

2

前回までのラブライブ!

Page 3: 20150909卒研進捗LT

研究目標

•フォトグラファー,イラストレーター,その他すべての画像を扱う人々に著作権の宣言が容易に行えるシステムを提供する

‒Windows, OS X, Linux で動かせるようにする‒OSS として公開する

•名前・連絡先などのダイアログ形式や自由入力,バイナリ埋め込みなど様々な方法で宣言できるようにする

• ‌現実的な拡大縮小・ノイズが発生しても情報の読み取りが可能であるようにする

3

( 2015/08/26 )

Page 4: 20150909卒研進捗LT

Pixel-based steganography

4

拡大縮小時のブロックサイズの変更

( 2015/08/05 )

Page 5: 20150909卒研進捗LT

5

この変更分を求めたい

Page 6: 20150909卒研進捗LT

Pixel-based steganography

6

R =‌ 10 * (d – 1) + 5 G =‌ 10 * d + 5B =‌ 10 * (d + 1) + 5 d = block size

最も劣化しにくい緑にブロックサイズを記録

最も劣化しやすい赤を弱くする

( 2015/08/05 )

Page 7: 20150909卒研進捗LT

Pixel-based steganography

7

ブロックサイズが 8の場合‌ )1. 左上‌ (1, 1) の値を取得2. d = (R + 10 + G + B – 10) / 33. d = 85 なので元のブロックサイズは‌ 84. (0, 0) ~‌ (64, 64) の範囲で繰り返す5. d と等しい値の長さ‌ L を求める6. 色が変わる境界までの長さ‌M を求める7. L と‌M の間は信頼できない領域8. S = (M – L)^2 が使用できるブロックサイズ

( 2015/08/05 )

Page 8: 20150909卒研進捗LT

Pixel-based steganography

8

極端な劣化への耐性

( 2015/08/05 )

Page 9: 20150909卒研進捗LT

9

q = 0 q = 10 q = 20 q = 30

R = 141G = 84B = 39d = 88 → 8

R = 49G = 98B = 102d = 83 → 8

R = 50G = 93B = 100d = 81 → 8

R = 68G = 87B = 101d = 85.3 → 8

※ d = (R + 10 + G + B – 10) / 3

Page 10: 20150909卒研進捗LT

Pixel-based steganography

10

ブロックサイズを求めるだけなら良好

( 2015/08/05 )

Page 11: 20150909卒研進捗LT

11

やめました

Page 12: 20150909卒研進捗LT

アンカーを使わない理由

•アンカーを消されると詰む

•色変化を確実に吸収できるとは限らない

•特徴的なデータを書き込めば不要なのでは

‒いわゆるマジックナンバー10101011110000111000110010101…

•気持ち悪い

12

Page 13: 20150909卒研進捗LT

アンカーを使わない理由

•アンカーを消されると詰む

•色変化を確実に吸収できるとは限らない

•特徴的なデータを書き込めば不要なのでは

‒いわゆるマジックナンバー10101011110000111000110010101…

•気持ち悪い

13

Page 14: 20150909卒研進捗LT

14

その前に

Page 15: 20150909卒研進捗LT

ヘッダー

•書き込んだデータの長さが分からない

•むりやり読み込むと文字化けの原因

•データの長さを記録しておく必要がある

ヘッダーが必要15

Page 16: 20150909卒研進捗LT

データ構成

16

ブロックサイズ算出用 データの長さ 埋め込むデータ

Page 17: 20150909卒研進捗LT

17

今週の進捗

Page 18: 20150909卒研進捗LT

ブロック単位の読み書き

• 1px だけにデータを書き込むと縮小したときに読み取れない•複数ピクセルに畳み込んで冗長化する必要がある

• N x N の大きさでまとめて同じ値を畳み込む‒8 x 8 とか‒大きいほど縮小時の読み取り可能性が上がる

• 2重ループでちんたら回してる余裕は無い•ポインターを使う

18

Page 19: 20150909卒研進捗LT

unsafe• unsafe ブロックなどで明示的に指定•コンパイラのオプションで明示的に指定

•ポインターなどの低レベル機能

•メモリの固定

•生 Cとの連携• Win32APIの呼び出し•パフォーマンス向上に使うのは最終手段

19

Page 20: 20150909卒研進捗LT

20http://spellshelp.com/black_magic.php

Page 21: 20150909卒研進捗LT

黒魔術

21

public static unsafe string Read(CoreImage image, int blockSize = 8)

{

var bmp = image.Bitmap.LockBits(

new Rectangle(Point.Empty, new Size(image.Width, image.Height)),

ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

var bmpPtr = (byte*)(void*)bmp.Scan0;

for (var y = 0; y < bmp.Height - blockSize; y += blockSize)

{

var bmpPtrLineStartPos = bmpPtr;

for (var x = 0; x < bmp.Width - blockSize; x += blockSize)

{

var bmpPtrBlockStartPos = bmpPtr;

var valueList = new List<int>(blockSize * blockSize);

for (var by = y; by < y + blockSize; by++)

{

for (var bx = x; bx < x + blockSize; bx++)

{

var r = *(bmpPtr + 2) % 10.0;

var g = *(bmpPtr + 1) % 10.0;

var b = *bmpPtr % 10.0;

if (r == 2 || g == 2 || b == 2)

{

valueList.Add(0);

}

else if (r == 3 || g == 3 || b == 3)

{

valueList.Add(1);

}

else

{

valueList.Add(-1);

}

bmpPtr += 4;

}

bmpPtr += 4 * (image.Width - blockSize);

}

result.Append(

valueList.Count(a => a == 0) > valueList.Count(a => a == 1) ? "0" : "1");

bmpPtr = bmpPtrBlockStartPos + (blockSize * 4);

}

bmpPtr = bmpPtrLineStartPos + (image.Width * 4 * blockSize);

}

image.Bitmap.UnlockBits(bmp);

}

Page 22: 20150909卒研進捗LT

unsafe• unsafe ブロックなどで明示的に指定•コンパイラのオプションで明示的に指定

•ポインターなどの低レベル機能

•メモリの固定

•生 Cとの連携• Win32APIの呼び出し•パフォーマンス向上に使うのは最終手段

22

Page 23: 20150909卒研進捗LT

23

OpenCL

Page 24: 20150909卒研進捗LT

24

Cloo.NET Framework / Mono

Page 25: 20150909卒研進捗LT

25

Page 26: 20150909卒研進捗LT

データ構成

26

ブロックサイズ算出用 データの長さ 埋め込むデータ

ここが問題 Int32 UTF-8 → 2進数10101101100010110001101000

1…

Page 27: 20150909卒研進捗LT

ブロックサイズ算出パターン

27

単純

現在使用中

ポインタでのアクセスが楽

縦方向のサイズ変更が1:1 以外だと死ぬ

一番確実

ポインターでのアクセスがつらい

Page 28: 20150909卒研進捗LT

28

Page 29: 20150909卒研進捗LT

29

demo