Ejemplo n.º 1
0
 def embed(self,mess):
     # вычислить блоки коэффициентов DCT из изображения
     DCT_blocks = [np.round(cv2.dct(block)) for block in self.blocks]
     
     # разделить каждый коэффициент на величину квантования
     quantizedDCT = [np.round(DCT_block/self.quant) for DCT_block in DCT_blocks]
     # quantizedDCT = [np.round(DCT_block/1) for DCT_block in DCT_blocks]
     # перевести сообщение в двоичную форму
     mess = self.binary_text(mess)
     messIndex = 0
     # вставлять каждый бит сообщения в 1-й коэффициент каждого блока
     for block in quantizedDCT:
         DC = int(block[0,0])
         if DC % 2 == 0:
             DC ^= int(mess[messIndex])
         else:
             DC ^= int(mess[messIndex]) ^ 1
         block[0,0] = np.float32(DC)
         messIndex += 1
         if messIndex == len(mess): break
     if messIndex < len(mess)-1: raise StegaException("not enough spaces to embed")
     # умножить каждый коэффициент на значение квантования
     DCT_blocks = [block * self.quant for block in quantizedDCT]
     # DCT_blocks = [block * 1 for block in quantizedDCT]
     # рассчитать обратное DCT, чтобы получить значения изображения
     Img_blocks = [np.round(cv2.idct(block)) for block in DCT_blocks]
     # изменить форму блоков в форму изображения
     img = self.reshape(Img_blocks)
     # img = cv2.resize(img,(self.oricol,self.orirow))
     return img
Ejemplo n.º 2
0
def jpeg_gray(x):
    output = np.zeros(x.shape, dtype=int)
    w = x.shape[0]
    h = x.shape[1]
    
    quantization_table = np.array([
        [16, 11, 10, 16,  24,  40,  51,  61],
        [12, 12, 14, 19,  26,  58,  60,  55],
        [14, 13, 16, 24,  40,  57,  69,  56],
        [14, 17, 22, 29,  51,  87,  80,  62],
        [18, 22, 37, 56,  68, 109, 103,  77],
        [24, 36, 55, 64,  81, 104, 113,  92],
        [49, 64, 78, 87, 103, 121, 120, 101],
        [72, 92, 95, 98, 112, 100, 103,  99]
    ])
    
    for i in range(0, h, 8):
        for j in range(0, w, 8):
            sample = x[j:j+8, i:i+8]
            dct = np.around(cv2.dct(sample.astype(float)))
            dct_quant = np.around(np.divide(dct, quantization_table))
            scaled_quant = np.multiply(dct_quant, quantization_table)
            out_block = np.around(cv2.idct(scaled_quant))
            output[j:j+8, i:i+8] = out_block
            
    output = output/np.amax(output)*255
    print(np.amax(output))
    return output.astype(np.uint8)
Ejemplo n.º 3
0
    def embed(self, mess):
        # calculate DCT coefficients blocks from image
        DCT_blocks = [np.round(cv2.dct(block)) for block in self.blocks]

        # divide each coefficient by quantization value
        quantizedDCT = [
            np.round(DCT_block / self.quant) for DCT_block in DCT_blocks
        ]
        # quantizedDCT = [np.round(DCT_block/1) for DCT_block in DCT_blocks]
        # translate message to binary form
        mess = self.binary_text(mess)
        messIndex = 0
        # embed each bit of message to the 1st coefficient of each block
        for block in quantizedDCT:
            DC = int(block[0, 0])
            if DC % 2 == 0:
                DC ^= int(mess[messIndex])
            else:
                DC ^= int(mess[messIndex]) ^ 1
            block[0, 0] = np.float32(DC)
            messIndex += 1
            if messIndex == len(mess): break
        if messIndex < len(mess) - 1:
            raise StegaException("not enough spaces to embed")
        # multiply each coefficient with quantization value
        DCT_blocks = [block * self.quant for block in quantizedDCT]
        # DCT_blocks = [block * 1 for block in quantizedDCT]
        # calculate inverse DCT to get image's values
        Img_blocks = [np.round(cv2.idct(block)) for block in DCT_blocks]
        # reshape blocks to image form
        img = self.reshape(Img_blocks)
        # img = cv2.resize(img,(self.oricol,self.orirow))
        return img
Ejemplo n.º 4
0
def DCT_IDCT_OpenCv(image):
    dct = cv2.dct(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)

    cosine = np.log(np.abs(dct))

    iimage = cv2.idct(dct)

    Plt_Contrast(image, cosine, iimage)
Ejemplo n.º 5
0
def idctBlock(dctBlockList):
    '''
    对每一个块进行逆dct变换
    '''
    return [cv.idct(block) for block in dctBlockList]
Ejemplo n.º 6
0
def blocks_idct(dct_blocks):
    idct_blocks = []
    for blocks_no in range(len(dct_blocks)):
        idct_block = cv2.idct(dct_blocks[blocks_no])
        idct_blocks.append(idct_block)
    return idct_blocks