Chương 2: MỘT SỐ KỸ THUẬT BẢO VỆ BẢN QUYỀN BẢN ĐỒ VỚI THỦY VÂN SỐ
2.2. Thuật toán thủy vân trên dữ liệu dạng vùng
2.2.5. Thuật toán thủy vân
Gọi là tỷ lệ đích của các đa giác đƣợc nhúng, là một tham số cho thuật toán. Với mỗi đa giác trong tập dữ liệu ta tính định danh bền vững . Sau đó gieo cho bộ sinh số giả ngẫu nhiên với hạt . Nếu số nguyên đầu tiên sinh bởi G modulo bằng 0 thì ta nhúng một bit vào đa giác. Bit đƣợc chọn dựa theo giá trị nhị phân tiếp theo sinh bởi G và được nhúng vào sử dụng phương pháp giãn mô tả ở phần trước.
Thuật toán 2.1. Thủy vân bản đồ vùng bằng co giãn đa giác Input: khóa bí mật , tỷ lệ thủy vân , , bước lượng tử Data: là tập dữ liệu bản đồ gốc.
Output: tập dữ liệu đã nhúng thủy vân.
foreach ( ) do O centroid( );
id hsb( ); /* robust identifier id */
seed( ); /* seed the PRNG G with K ã id */
if nextInteger( ) mod then // Nhúng thủy vân đa giác P.
orientation( ); /* orientation */
max{ }; /* main length */
nextFloat
nextInteger( ) mod 2; /* watermark bit b */
quantize ( ); /* quantize */
; /* expansion factor */
expand ;
if testCollision() then rollback() ;
endif;
endif;
endfor.
2.1.5.2. Tách thủy vân
Cho một tập dữ liệu . Trước hết ta dịch nó vào hệ quy chiếu gốc để nhận được . Thuật toán phát hiện (tách) thủy vân cũng tương tự như thuật toán nhúng. Nó gồm hai bước: tính tỷ số các đa giác đối chiếu và so tỷ số này với một ngưỡng định trước . Các giá trị của và được dùng để phát hiện phải giống với các giá trị đƣợc dùng trong quá trình nhúng thủy vân. Vì thế người chủ sở hữu phải giữ các giá trị này bí mật. Với mỗi đa giác ta gieo mầm số giả ngẫu nhiên từ khóa nối với định danh. Thuật toán tách thủy vân:
Thuật toán 2.2. Tách thủy vân đã nhúng
Input: khóa bí mật , tỷ lệ thủy vân , , bước lượng tử , xác suất lỗi tối đa .
Data: là tập dữ liệu bản đồ cần tách thủy vân.
Output: MARK hay là NO-MARK (có nhúng thủy vân hay không).
foreach building P in DB do centroid(P);
hsb(O, h);
seed( );
if nextInteger( ) mod then ++; /* increment total count */
orientation(P);
max{ };
nextFloat( ). ( );
nextInteger( ) mod 2; /* expected bit b */ ; quantize( ); /* closest 0-quantizer */
quantize( ); /* closest 1-quantizer */
if then
; /* found bit is b′= 1 */
else
; /* found bit is b′= 0 */
endif;
if b = b′then m++; /* increment match count */
endif;
endfor;
threshold( );
If then return MARK; else return NO MARK;
Giải mã. Để giải mã một bit từ một giá trị đã lƣợng tử hóa , ta đơn giản kiểm tra nó là một trong các 1-lƣợng tử hoặc một trong các 0-lƣợng tử. Nếu không thuộc các -lƣợng tử thì ta tính giá trị lƣợng tử hóa gần nhất trong các 1-lƣợng tử và giá trị lƣợng tử hóa gần nhất trong các 0-lƣợng tử. Sau đó tính các khoảng
cách . Nếu thì ta giải mã ra bit 0, nếu
thì ta giải mã đƣợc bit 1. Nếu thì không giải mã ra bit nào. Chú ý rằng một giá trị lượng tử với bước có thể được biến đổi nhiều nhất một khoảng cỡ mà không làm sai kết quả giải mã. Sự lƣợng tử hóa đƣợc chọn vì nó cho phép tối ƣu thỏa hiệp giữa trung bình nhiễu (ở đây là ) và biến đổi tối thiểu gây sai số kết quả giải mã ( ).
Nếu bit mong muốn là và bit giải mã đƣợc là giống nhau thì ta nói rằng đa giác được khớp. Ta duy trì hai bộ đếm (khớp) và (tổng). Biến đƣợc tăng mỗi lần một đa giác thỏa mãn điều kiện thủy vân đƣợc tìm thấy. Biến tƣang mỗi lần đa giác đó đƣợc khớp. Do đó, tỷ số phát hiện là tỷ lệ các đa giác khớp. Dễ thấy rằng trên một tập dữ liệu của hãng thứ ba, xác suất để mỗi đa giác khớp là 1/2. Do vậy, tỷ lệ đƣợc so sánh với giá trị kỳ vọng 1/2 của nó để quyết định xem dấu thủy vân của người chủ sở hữu có được nhúng vào trong tài liệu hay không. Trong thực tế người ta sử dụng một ngưỡng phát hiện để quyết định vùng có nhúng thủy
vân hay không. Vùng có nhúng thủy vân nếu nhƣ có . Sự phù hợp của quá trình phát hiện thủy vân phụ thuộc nhiều vào giá trị của .Ta có thể chọn
làm ngƣỡng phát hiện trong thực nghiệm.