我正在尝试使用PIL中的图像库在python 3.7.2中制作图像隐写脚本。我的用于将一个图像隐藏在另一个图像中的脚本无法正常工作,一旦再次提取生成的文件hidden.png,它就会输出全黑图像或对比度较低,颜色不同的图像,具体取决于所选位数。 (我的提取脚本已经过测试并且可以正常工作。)我通常选择4位,但是在7点仍然无法正常工作。
这是隐藏脚本的代码:
def hide(medium, secret_image, lsb):
medimage = Image.open(medium).convert(mode="RGB") #open the medum
secretimage = Image.open(secret_image).convert(mode="RGB") #open the secret image
medimage = medimage.resize(secretimage.size) #resize the medium to be same size as secret
acrossrow = 0 #start at first row
downcol = 0 #start at first column
secret = secretimage.load() #load pixels from secretimage
med = medimage.load()
while acrossrow < secretimage.height:
downcol = 0 #stay first column until reach bottom row
while downcol < secretimage.width:
r, g, b, = secret[acrossrow,downcol] #r,g,b = the rgb of secret image pixel
r = (r >> 8 - lsb) #shift amount of significant bits wanted to the end for hiding
g = (g >> 8 - lsb)
b = (b >> 8 - lsb)
r1, g1, b1 = med[acrossrow,downcol] #more rgb values for medium
r1 = r1 & (0b11111111 << lsb) #remove the last n amount of bits for replacing
g1 = g1 & (0b11111111 << lsb)
b1 = b1 & (0b11111111 << lsb)
r1 = r1 | r #compare medium with secret, combining all 1s
g1 = g1 | g
b1 = b1 | g
med[acrossrow,downcol] = (r1, g1, b1) #send new rgb values to medium
downcol = downcol + 1 #go to next column
acrossrow = acrossrow + 1 #go to next row
medimage.save('hidden.png') #save modified image to new file
medimage.show() #open and display new image
FYI:media =介质的路径,secret_image =秘密的路径,而lsb是我要从秘密图像隐藏到介质中的位数。
我已经检查了我的代码,但是如果有人可以帮助我,我将无法看到问题,那将是很好的。谢谢!
编辑:Here is a link to the full script if you want to test it or build on it. Here is the link to my test hidden.png That one uses 2 lsb Here is the link to the medium. Here is the link to the secret image.对于链接的媒体和秘密图像,我使用的是4 lsb。
答案 0 :(得分:0)
好吧,在检查完添加的图像并运行自己的测试之后,据我所知,您的代码运行正常。对于我自己的测试,我以hide()
作为“中”图像,将brain.png
函数应用于sat.png
文件,并检查了{链接的代码从中生成(使用hidden.png
的{{1}}值)。
是的,结果中的颜色与原始颜色略有不同,但这是可以预期的,因为使用的隐藏处理有效地将原始像素的每像素24位(3 x 8)减少到12(3 * 4),因此可以理解,诸如对比度之类的东西将因此遭受损失。
下面是我的图像编辑器中并排显示的图像的原始(左)和提取版本,显示了这些差异:
我认为问题可能仅仅是因为您不完全了解这种隐秘技术的工作原理。
答案 1 :(得分:0)
我已经检查完代码,并将提取脚本从原始隐藏代码更改为:
def hide(medium, secret_image, lsb):
medimage = Image.open(medium).convert(mode="RGB")
secretimage = Image.open(secret_image).convert(mode="RGB")
medimage = medimage.resize(secretimage.size)
acrossrow = 0
downcol = 0
secret = secretimage.load()
med = medimage.load()
result = Image.new("RGB", medimage.size)
r_pixels = result.load()
while acrossrow < secretimage.height:
downcol = 0
while downcol < secretimage.width:
m_r, m_g, m_b = med[acrossrow, downcol]
s_r, s_g, s_b = secret[acrossrow, downcol]
r = (m_r >> lsb << lsb) | (s_r >> (8 - lsb))
g = (m_g >> lsb << lsb) | (s_g >> (8 - lsb))
b = (m_b >> lsb << lsb) | (s_b >> (8 - lsb))
r_pixels[acrossrow, downcol] = r, g, b
downcol = downcol + 1
acrossrow = acrossrow + 1
result.save('testhid.png')
result.show()
result.close()
medimage.close()
secretimage.close()
它现在可以完美地在@martineau发布的图像中都带有黄色的大脑。我更新后的代码的链接为here.,如果有人可以解释为什么这样做有效而我的原始代码无效,那太好了! 谢谢!