Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV-保存为JPEG时禁用所有像素更改_Python_Python 2.7_Python 3.x_Opencv_Jpeg - Fatal编程技术网

Python OpenCV-保存为JPEG时禁用所有像素更改

Python OpenCV-保存为JPEG时禁用所有像素更改,python,python-2.7,python-3.x,opencv,jpeg,Python,Python 2.7,Python 3.x,Opencv,Jpeg,我正在使用OpenCV Python包(OpenCV Python==3.2.0.8)编写一个Python最低有效位(LSB)隐写术实用程序(2和3兼容性)。它似乎可以完美地处理我测试过的大量PNG文件,但我注意到,似乎不管怎样,每次我调用cv2.imwrite时,JPEG文件的像素都会发生变化。下面是我的LSBCodec类的save方法: class LSBCodec(object): # ... def save(self, filename): ext =

我正在使用OpenCV Python包(
OpenCV Python==3.2.0.8
)编写一个Python最低有效位(LSB)隐写术实用程序(2和3兼容性)。它似乎可以完美地处理我测试过的大量PNG文件,但我注意到,似乎不管怎样,每次我调用
cv2.imwrite
时,JPEG文件的像素都会发生变化。下面是我的
LSBCodec
类的
save
方法:

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,并确定是否应提供用于解码数据的简单异或密钥。第二个3位确定用于以下数据的最低有效位的数量。使用2位且无异或键,编码的值应在前两个像素(6个通道)上展开(但存储反向)

原始的前两个像素:
[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,它会工作吗?

jpeg压缩是有损压缩,而PNG使用无损压缩。从本质上讲,除非使用0%的压缩,否则使用jpeg编码将降低最低有效位的精度,明白吗。我试着保存图像和PNG,它似乎工作得很好。我想这个问题可以解决,除非有更多的东西要添加。jpeg通常也会压缩颜色而不是亮度,我在
cv2中看不到任何选项。理论上,如果你以完全0%的压缩保存,jpeg就可以了,但似乎100%的质量仍然在轻微地修改这些值。理论上,100%的质量下没有无损压缩。即使在这种情况下,也会有失真,但失真程度很小。它处于量化DCT系数的自然状态,对此无能为力。jpeg压缩是有损压缩,而png使用无损压缩。从本质上讲,除非使用0%的压缩,否则使用jpeg编码将降低最低有效位的精度,明白吗。我试着保存图像和PNG,它似乎工作得很好。我想这个问题可以解决,除非有更多的东西要添加。jpeg通常也会压缩颜色而不是亮度,我在
cv2中看不到任何选项。理论上,如果你以完全0%的压缩保存,jpeg就可以了,但似乎100%的质量仍然在轻微地修改这些值。理论上,100%的质量下没有无损压缩。即使在这种情况下,也会有失真,但失真程度很小。它处于对DCT系数进行量化的自然状态,对此无能为力。