Python OpenCV-保存为JPEG时禁用所有像素更改
我正在使用OpenCV Python包(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==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系数进行量化的自然状态,对此无能为力。