20150909卒研進捗LT
Transcript of 20150909卒研進捗LT
![Page 1: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/1.jpg)
![Page 2: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/2.jpg)
2
前回までのラブライブ!
![Page 3: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/3.jpg)
研究目標
•フォトグラファー,イラストレーター,その他すべての画像を扱う人々に著作権の宣言が容易に行えるシステムを提供する
‒Windows, OS X, Linux で動かせるようにする‒OSS として公開する
•名前・連絡先などのダイアログ形式や自由入力,バイナリ埋め込みなど様々な方法で宣言できるようにする
• 現実的な拡大縮小・ノイズが発生しても情報の読み取りが可能であるようにする
3
( 2015/08/26 )
![Page 4: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/4.jpg)
Pixel-based steganography
4
拡大縮小時のブロックサイズの変更
( 2015/08/05 )
![Page 5: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/5.jpg)
5
この変更分を求めたい
![Page 6: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/6.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/7.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/8.jpg)
Pixel-based steganography
8
極端な劣化への耐性
( 2015/08/05 )
![Page 9: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/9.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/10.jpg)
Pixel-based steganography
10
ブロックサイズを求めるだけなら良好
( 2015/08/05 )
![Page 11: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/11.jpg)
11
やめました
![Page 12: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/12.jpg)
アンカーを使わない理由
•アンカーを消されると詰む
•色変化を確実に吸収できるとは限らない
•特徴的なデータを書き込めば不要なのでは
‒いわゆるマジックナンバー10101011110000111000110010101…
•気持ち悪い
12
![Page 13: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/13.jpg)
アンカーを使わない理由
•アンカーを消されると詰む
•色変化を確実に吸収できるとは限らない
•特徴的なデータを書き込めば不要なのでは
‒いわゆるマジックナンバー10101011110000111000110010101…
•気持ち悪い
13
![Page 14: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/14.jpg)
14
その前に
![Page 15: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/15.jpg)
ヘッダー
•書き込んだデータの長さが分からない
•むりやり読み込むと文字化けの原因
•データの長さを記録しておく必要がある
ヘッダーが必要15
![Page 16: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/16.jpg)
データ構成
16
ブロックサイズ算出用 データの長さ 埋め込むデータ
![Page 17: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/17.jpg)
17
今週の進捗
![Page 18: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/18.jpg)
ブロック単位の読み書き
• 1px だけにデータを書き込むと縮小したときに読み取れない•複数ピクセルに畳み込んで冗長化する必要がある
• N x N の大きさでまとめて同じ値を畳み込む‒8 x 8 とか‒大きいほど縮小時の読み取り可能性が上がる
• 2重ループでちんたら回してる余裕は無い•ポインターを使う
18
![Page 19: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/19.jpg)
unsafe• unsafe ブロックなどで明示的に指定•コンパイラのオプションで明示的に指定
•ポインターなどの低レベル機能
•メモリの固定
•生 Cとの連携• Win32APIの呼び出し•パフォーマンス向上に使うのは最終手段
19
![Page 20: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/20.jpg)
20http://spellshelp.com/black_magic.php
![Page 21: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/21.jpg)
黒魔術
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](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/22.jpg)
unsafe• unsafe ブロックなどで明示的に指定•コンパイラのオプションで明示的に指定
•ポインターなどの低レベル機能
•メモリの固定
•生 Cとの連携• Win32APIの呼び出し•パフォーマンス向上に使うのは最終手段
22
![Page 23: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/23.jpg)
23
OpenCL
![Page 24: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/24.jpg)
24
Cloo.NET Framework / Mono
![Page 25: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/25.jpg)
25
![Page 26: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/26.jpg)
データ構成
26
ブロックサイズ算出用 データの長さ 埋め込むデータ
ここが問題 Int32 UTF-8 → 2進数10101101100010110001101000
1…
![Page 27: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/27.jpg)
ブロックサイズ算出パターン
27
単純
現在使用中
ポインタでのアクセスが楽
縦方向のサイズ変更が1:1 以外だと死ぬ
一番確実
ポインターでのアクセスがつらい
![Page 28: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/28.jpg)
28
![Page 29: 20150909卒研進捗LT](https://reader031.fdocuments.net/reader031/viewer/2022030207/58aa7d181a28abbc1e8b6fef/html5/thumbnails/29.jpg)
29
demo