2120056
笠松 惇
2
closed α
• Windows 用の GUI を仮実装
• よさそうという反応は得られた
public β
• Reed-Solomon符号・畳み込み符号の実装
• 多少宣伝して反応を得たい
卒論
• スケジュールによっては大炎上🔥
リリース
• OS X, Linux 用の GUI の製作
• リファクタリング
← いまここ
← できれば11月中に
公開したい
← 2016 Q1
3
厳しい
ので現実から目を背けた
ブロック単位での読み書き
• 物理層のノイズ耐性が上がる
‒ 論理層は符号化後のビット列
4
x 10
x 3
x 2
x 1
var linearBitArray = dataBits.ToLinearIntList().ToArray();
fixed (int* dataPtrZero = linearBitArray)
{
var dataPtr = dataPtrZero;
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;
for (var by = y; by < y + blockSize; by++)
{
for (var bx = x; bx < x + blockSize; bx++)
{
var r = (byte)(*(bmpPtr + 2) / 10.0);
byte rVal;
byte gVal;
var b = (byte)(*bmpPtr / 10.0);
byte bVal;
switch (*dataPtr)
{
case 0:
case 1:
rVal = getCappedValue(r,
*dataPtr);
gVal = *(bmpPtr + 1);
bVal = getCappedValue(b,
*dataPtr);
break;
default:
image.Bitmap.UnlockBits(bmp);
}
*(bmpPtr + 2) = rVal;
*(bmpPtr + 1) = gVal;
*(bmpPtr) = bVal;
bmpPtr += 4;
研究方法①
• 著作権情報の埋め込みのために画像の画素値を利用する
‒ 画像から不要なメタデータを省いても必ず画像そのものは残るため
• 文字列データは UTF-8 でエンコードした上で2進数に変換する
• 変換した2進文字列を画素値に畳み込む
6
あ 0011000001000010
7
あ 0011000001000010 0 0 1 1 0 0 0 0 0 1 0 0 0 0 1 0 ‘0’
リード・ソロモン符号
• 構造上,連続したエラーに強い
8
11011101 01011101 10110111 00010011 00100000
シンボル(ガロア体)
符号語 冗長語
• シンボル単位で冗長化している
• 1シンボル全てのデータが破損しても復元できる
‒ 8bit 単位なので 64 x 64 px の範囲でエラーが起きても復元できる
リード・ソロモン符号
• 符号
9
𝐶 𝑥 = 𝑥 𝑁−𝐾
× 𝐼 𝑥 + 𝑥 𝑁−𝐾
× 𝐼 𝑥 𝑚𝑜𝑑
𝑖=𝑏
2𝑡−1+𝑏
𝑥 − 𝛼 𝑖
• 復号
省略
データを係数にしたガロア体の8次多項式 ← を生成多項式で割った余りを連結
10
あ 0011000001000010
var linearBitArray = dataBits.ToLinearIntList().ToArray();
fixed (int* dataPtrZero = linearBitArray)
{
var dataPtr = dataPtrZero;
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;
for (var by = y; by < y + blockSize; by++)
{
for (var bx = x; bx < x + blockSize; bx++)
{
var r = (byte)(*(bmpPtr + 2) / 10.0);
byte rVal;
byte gVal;
var b = (byte)(*bmpPtr / 10.0);
byte bVal;
switch (*dataPtr)
{
case 0:
case 1:
rVal = getCappedValue(r,
*dataPtr);
gVal = *(bmpPtr + 1);
bVal = getCappedValue(b,
*dataPtr);
break;
default:
image.Bitmap.UnlockBits(bmp);
}
*(bmpPtr + 2) = rVal;
*(bmpPtr + 1) = gVal;
*(bmpPtr) = bVal;
bmpPtr += 4;
var dataArray = data.ToCharArray();
fixed (char* dataPtrZero = dataArray)
{
var dataPtr = dataPtrZero;
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;
for (var by = y; by < y + blockSize; by++)
{
for (var bx = x; bx < x + blockSize; bx++)
{
var r = Math.Floor(*(bmpPtr + 2) /
10.0);
byte rVal;
var g = Math.Floor(*(bmpPtr + 1) /
10.0);
switch (*dataPtr)
{
case '0':
rVal = Convert.ToByte(r + "2");
gVal = Convert.ToByte(g + "2");
bVal = Convert.ToByte(b + "2");
break;
case '1':
rVal = Convert.ToByte(r + "7");
gVal = Convert.ToByte(g + "7");
bVal = Convert.ToByte(b + "7");
break;
case '0':
image.Bitmap.UnlockBits(bmp);
return image;
default:
throw new
NotImplementedException();
}
*(bmpPtr + 2) = rVal;
demo
13

20151118卒研進捗LT

  • 1.
  • 2.
    2 closed α • Windows用の GUI を仮実装 • よさそうという反応は得られた public β • Reed-Solomon符号・畳み込み符号の実装 • 多少宣伝して反応を得たい 卒論 • スケジュールによっては大炎上🔥 リリース • OS X, Linux 用の GUI の製作 • リファクタリング ← いまここ ← できれば11月中に 公開したい ← 2016 Q1
  • 3.
  • 4.
  • 5.
    var linearBitArray =dataBits.ToLinearIntList().ToArray(); fixed (int* dataPtrZero = linearBitArray) { var dataPtr = dataPtrZero; 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; for (var by = y; by < y + blockSize; by++) { for (var bx = x; bx < x + blockSize; bx++) { var r = (byte)(*(bmpPtr + 2) / 10.0); byte rVal; byte gVal; var b = (byte)(*bmpPtr / 10.0); byte bVal; switch (*dataPtr) { case 0: case 1: rVal = getCappedValue(r, *dataPtr); gVal = *(bmpPtr + 1); bVal = getCappedValue(b, *dataPtr); break; default: image.Bitmap.UnlockBits(bmp); } *(bmpPtr + 2) = rVal; *(bmpPtr + 1) = gVal; *(bmpPtr) = bVal; bmpPtr += 4;
  • 6.
    研究方法① • 著作権情報の埋め込みのために画像の画素値を利用する ‒ 画像から不要なメタデータを省いても必ず画像そのものは残るため •文字列データは UTF-8 でエンコードした上で2進数に変換する • 変換した2進文字列を画素値に畳み込む 6 あ 0011000001000010
  • 7.
    7 あ 0011000001000010 00 1 1 0 0 0 0 0 1 0 0 0 0 1 0 ‘0’
  • 8.
    リード・ソロモン符号 • 構造上,連続したエラーに強い 8 11011101 0101110110110111 00010011 00100000 シンボル(ガロア体) 符号語 冗長語 • シンボル単位で冗長化している • 1シンボル全てのデータが破損しても復元できる ‒ 8bit 単位なので 64 x 64 px の範囲でエラーが起きても復元できる
  • 9.
    リード・ソロモン符号 • 符号 9 𝐶 𝑥= 𝑥 𝑁−𝐾 × 𝐼 𝑥 + 𝑥 𝑁−𝐾 × 𝐼 𝑥 𝑚𝑜𝑑 𝑖=𝑏 2𝑡−1+𝑏 𝑥 − 𝛼 𝑖 • 復号 省略 データを係数にしたガロア体の8次多項式 ← を生成多項式で割った余りを連結
  • 10.
  • 11.
    var linearBitArray =dataBits.ToLinearIntList().ToArray(); fixed (int* dataPtrZero = linearBitArray) { var dataPtr = dataPtrZero; 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; for (var by = y; by < y + blockSize; by++) { for (var bx = x; bx < x + blockSize; bx++) { var r = (byte)(*(bmpPtr + 2) / 10.0); byte rVal; byte gVal; var b = (byte)(*bmpPtr / 10.0); byte bVal; switch (*dataPtr) { case 0: case 1: rVal = getCappedValue(r, *dataPtr); gVal = *(bmpPtr + 1); bVal = getCappedValue(b, *dataPtr); break; default: image.Bitmap.UnlockBits(bmp); } *(bmpPtr + 2) = rVal; *(bmpPtr + 1) = gVal; *(bmpPtr) = bVal; bmpPtr += 4;
  • 12.
    var dataArray =data.ToCharArray(); fixed (char* dataPtrZero = dataArray) { var dataPtr = dataPtrZero; 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; for (var by = y; by < y + blockSize; by++) { for (var bx = x; bx < x + blockSize; bx++) { var r = Math.Floor(*(bmpPtr + 2) / 10.0); byte rVal; var g = Math.Floor(*(bmpPtr + 1) / 10.0); switch (*dataPtr) { case '0': rVal = Convert.ToByte(r + "2"); gVal = Convert.ToByte(g + "2"); bVal = Convert.ToByte(b + "2"); break; case '1': rVal = Convert.ToByte(r + "7"); gVal = Convert.ToByte(g + "7"); bVal = Convert.ToByte(b + "7"); break; case '0': image.Bitmap.UnlockBits(bmp); return image; default: throw new NotImplementedException(); } *(bmpPtr + 2) = rVal;
  • 13.