OpenCV - 保存为JPEG

时间:2017-08-14 17:54:34

标签: python python-2.7 python-3.x opencv jpeg

我正在使用OpenCV-Python包(opencv-python==3.2.0.8)在Python(2和3兼容性)中编写一个用于最低有效位(LSB)隐写的实用程序。它似乎与我测试的大量PNG文件完美配合,但我注意到的是,似乎无论如何,每当我调用cv2.imwrite时,JPEG文件的像素都会改变。以下是save类的LSBCodec方法:

class LSBCodec(object):
    # ...

    def save(self, filename):
        ext = filename.split(".")[-1].lower()  # assumptions made 
        if ext in ("jpg", "jpeg", "jpe"):
            args = [[int(cv2.IMWRITE_JPEG_QUALITY), 100]]
        elif ext in ("png",):
            args = [[int(cv2.IMWRITE_PNG_COMPRESSION), 0]]
        else:
            args = []
        cv2.imwrite(filename, self.img, *args)

然而,它仍然会改变像素。甚至一位改变它们会完全抛弃整个程序(因为最低有效位用于数据和元数据存储)。

例如,前3位应全部为0或全1,并确定是否应提供简单的XOR密钥来解码数据。第二个3位确定用于后续数据的最低有效位数。使用2位且不使用XOR键,编码的值应为0b000010(但反向存储)分布在前两个像素(6个通道)上。

原始前2个像素:
[ 44 120 216], [ 43 119 215]最后一位:000111

编码前2个像素:
[ 44 121 216], [ 42 118 214]最后一位:010000(反向)

存储前2个像素:
[ 44 121 217], [ 42 118 214]应与上述相同

如何在不改变像素的情况下保存JPEG文件?或者这是不可行的,因为我不熟悉一些JPEG图像编解码器?如果我将扩展名更改为PNG,它会起作用吗?

0 个答案:

没有答案