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
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)
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
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)
def idctBlock(dctBlockList): ''' 对每一个块进行逆dct变换 ''' return [cv.idct(block) for block in dctBlockList]
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