티스토리 뷰

월요일 부터 금요일 까지 잠자기 전에 나를 인도해주는 네이버 웹툰을 보다가 문뜩

경고문을 보고는 어..이게 캡처가 된다고 ? 하면서 스마트폰 캡처를 했는데 정말 가능하긴 하네요,

우리 열심히 밤낮없이 일하시는 작가님들 저작권을 어떻게 보호한다는 거지 라는 막연한생각에 한번 간단히 찾아봤습니다.

간단히 찾아 본 Frequency Method 방식 으로 3개가 있네요.

 

Attack 방법에 대해서 일반적으로 알려진 방법을 사용해보도하겠습니다.

아래 알고리즘들에 대해서 문뜩 필살기처럼 회피할 아이디어가 번뜩이지만, 조용히 테스트만 해보도록 하겠습니다.

이제 첫 번째 이야기를 진행하겠습니다.

 

DWT-DCT 알고리즘을 통한 watermarking 이미지 embedding - extraction 입니다.

 

[ Frequency Method ]

-  DWT-DCT  (첫번째 시리즈)

- DWT-DCT-SVD 

- DWT-DCT-SIFT

[ Deep Learning GAN Method]

  • rivaGan: encoder/decoder model with Attention mechanism + embed watermark bits into vector.

 

[ 검색 ] 역시 구글링 첫 번째 논문에 DWT-DCT image watermarking 이 나오네요

[ 결론 ] 여러분 함부로 캡처하지 마세요.

(Crop 에 취약하지만, 여러분 2007년 나온겁니다.!! 해결책이 있겠죠)

 

 

Combined DWT-DCT Digital Image Watermarking (2007)

 

Abstract: The proliferation of digitized media due to the rapid growth of networked multimedia systems, has created an urgent need for copyright enforcement technologies that can protect copyright ownership of multimedia objects. Digital image watermarking is one such technology that has been developed to protect digital images from illegal manipulations. In particular, digital image watermarking algorithms which are based on the discrete wavelet transform have been widely recognized to be more prevalent than others. This is due to the wavelets' excellent spatial localization, frequency spread, and multi-resolution characteristics, which are similar to the theoretical models of the human visual system. In this paper, we describe an imperceptible and a robust combined DWT-DCT digital image watermarking algorithm. The algorithm watermarks a given digital image using a combination of the Discrete Wavelet Transform (DWT) and the Discrete Cosine Transform (DCT). Performance evaluation results show that combining the two transforms improved the performance of the watermarking algorithms that are based solely on the DWT transform.

 

참고로 2007년에 나온 논문인데 인용수가 많은 걸 보고 이거구나 하는 생각에 한번 개략적인 컨셉만 보고 따라해봤습니다.

(** 지금이 2021년,, 14년전 에 나온 논문입니다.)

정확히 전부를 이해하기 위해서는 DCT, DWT 라는 transform 에 대해서 이해를 해야 되는데 추후 업데이트를 해서 자세히 써보도록 하겠습니다.

  • discrete cosine transform (DCT)
  • discrete wavelet transform (DWT)

 

준비1. watermark 이미지

(실제로 사용 프로그램에서는 watermark 이미지를 직접 쓰는일이 없고 암호화/복호화를 통해서 여러분이 추출을 시도해보려고 해도 힘들도록 만들어져 있습니다.)

 

Watermark Image

준비2. 샘플 이미지 

Sample Image

 

Embedding  과정

손쉽게 말하면 DWT 를 통해 얻어진 이미지에 watermark 이미지를 잘 녹여내고 이를 다시 Inverse DWT를 통하면 원본 이미지와 비슷하면서도 watermark 를 뽑아 낼 수 있는 그림이 완성이 됩니다.

 

Extraction 과정

Embedding 이미지가 오염되거나 변경, 변화가 생겨도 이를 잘 변환하면 원래의 watermark 이미지를 뽑아 낼 수 있습니다.

결론적으로 DWT-DCT 알고리즘 경우 crop /  affine transform 에 취약하네요. 그외 공격에는 그럭저럭 괜찮습니다.

(추출된 watermark 이미지 경우 아래처럼 노이즈가 섞여 있어서 이를 다시 denoising 하기 위한 딥러닝 모델을 통해 digital 로 바꾸는 무언가를 할 필요가 있을 것 같네요. - 기회가 되면 이것도 다루겠습니다.)

 

Attack Image Extraction(watermark)
Embedding (Initial)
Gaussian Blur
Histogram Equalization
Rotation (Left 90)
Rotation (Right 90)
Random Noise (± 10)
Resize

 

 

Python code

 아래 2개의 함수는 상황에 따라 조정을 해야되서 기존에서 수정을 진행하도록 하겠습니다.

  1. _ebmed_logic
  2. _extract_logic
# https://github.com/diptamath/DWT-DCT-Digital-Image-Watermarking
# https://thescipub.com/pdf/jcssp.2007.740.746.pdf

import os
import cv2

import pywt
import numpy as np
from scipy.fftpack import dct, idct

import matplotlib.pyplot as plt


class WaterMark(object):
    """
    
    """
    def __init__(self, img_shape=2048, mark_shape=128, level=1):
        self.img_shape = img_shape
        self.mark_shape = mark_shape
        self.level = level
        self.kernel = 8
        self.model = 'haar'
        
    def __repr__(self):
        return f'version 0.0.1'
    
    def _load(self, img_path: str, size: int):
        img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
        img = img.astype(np.float32)/255.0
        
        # size x size
        img = cv2.resize(img, (size, size), interpolation=cv2.INTER_CUBIC)
        return img
    
    def _dct_transform(self, img, inverse=False):
        
        h, w = img.shape[:2]
        buffer = np.zeros_like(img)
        trans_func = idct if inverse else dct
        
        for r in range(0, h, self.kernel):
            for c in range(0, w, self.kernel):
                subpixels = img[r:r+self.kernel, c:c+self.kernel]
                buffer[r:r+self.kernel, c:c+self.kernel] = trans_func(
                    trans_func(subpixels.T, norm="ortho").T, norm="ortho")
        return buffer
  
        
    
    def _embed_logic(self, mark, img):
        """
        // TODO: Implementation your logic
        """        
        return img        
        
    
    def embedding(self, img_path: str, mark_path: str):
        img = self._load(img_path, self.img_shape)
        mark =  self._load(mark_path, self.mark_shape)
        
        # [cAn, (cHn, cVn, cDn)
        coeffs = pywt.wavedec2(img, self.model, level=self.level)
        
        dct_cAn = self._dct_transform(coeffs[0])
        dct_cAn = self._embed_logic(mark, dct_cAn)
        coeffs[0] = self._dct_transform(dct_cAn, inverse=True)
                
        embed_img = pywt.waverec2(coeffs, self.model)
        embed_img = cv2.normalize(embed_img, None, 0, 255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)
        return embed_img
    
    def extract(self, img_path: str):
        img = self._load(img_path, self.img_shape)
        
        # [cAn, (cHn, cVn, cDn)
        coeffs = pywt.wavedec2(img, self.model, level=self.level)        
        dct_cAn = self._dct_transform(coeffs[0])
        mark_img = self._extract_logic(dct_cAn)
        mark_img = cv2.normalize(mark_img, None, 0, 255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)
        return mark_img
    
        
    def _extract_logic(self, img):
        """
        // TODO: Implementation your logic
        """
        return mark_img
    
if __name__ == '__main__':
    wm = WaterMark()
    img = wm.embedding('sample_2048.jpg', 'watermark.jpg')
    cv2.imwrite('sample_embed.jpg', img)

    mark = wm.extract('sample_embed.jpg')
    cv2.imwrite('extract_mark.jpg', mark)
    

 

 

 

 Distortion Image [ Next ,, 못잡을 것 같지 ? ]

과연 모든 화질을 포기하고 캡쳐를 했을 때 피할 수 있을까요 ? Hint 이미지에 특징점은 쉽게 바뀌지 않아요

 

 

 

참고 

  1. https://github.com/diptamath/DWT-DCT-Digital-Image-Watermarking
 

GitHub - diptamath/DWT-DCT-Digital-Image-Watermarking: A digital image watermarking algorithm based on combining two transforms;

A digital image watermarking algorithm based on combining two transforms; DWT and DCT. - GitHub - diptamath/DWT-DCT-Digital-Image-Watermarking: A digital image watermarking algorithm based on combi...

github.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함