免责声明:这是家庭作业的一部分,但已经被传了。我只是在寻找未来技术的正确解决方案。在
这个程序的目标是使用Python OpenCV库来实现图像隐写术(在其他图像中嵌入/提取图像)。这是通过使用最小有效位(LSB)方法对两个大小相等的图像进行的。在
该程序允许用户选择用于嵌入的比特数,因此使用1比特嵌入的图像几乎无法被人眼察觉,而使用7位则可以清楚地分辨出隐藏的图像。在
通过从秘密图像中获取每个RGB字节的最高有效位(MSB),并将它们设置在封面图像的LSB位置,我已经正确地实现了嵌入。在
我的问题是在嵌入秘密图像后提取它。代码运行后,我留下的图像似乎只是它的蓝色表示。我不知道我哪里出了问题,但我有一种感觉,这与我的位操作技术或OpenCV库的使用有关。如有任何帮助,我们将不胜感激,谢谢!在
提取代码:
import cv2
import numpy
def extract(img1, bitsUsed):
print "Extracting..."
# Import image & get dimensions
img = cv2.imread(img1)
h = img.shape[0]
w = img.shape[1]
# Create new image to extract secret image
# Same dimensions, and rgb channel
secretImg = numpy.zeros((h,w,3), numpy.uint8)
x, y = 0, 0
# Loop thru each pixel
while x < w:
while y < h:
# Grab the LSB (based on bitsUsed from embedding)
lsb_B = img.item(y,x,0) & bitsUsed
lsb_G = img.item(y,x,1) & bitsUsed
lsb_R = img.item(y,x,2) & bitsUsed
# Place those bits into MSB positions on new img
secretImg.itemset((y,x,0), lsb_B << (8 - bitsUsed))
secretImg.itemset((y,x,0), lsb_G << (8 - bitsUsed))
secretImg.itemset((y,x,0), lsb_R << (8 - bitsUsed))
y += 1
y = 0
x += 1
cv2.imwrite("extractedImg.png", secretImg)
njuffa是正确的。在提取过程中,如果只嵌入了1位,则需要使用0b0000001(1),对于2位使用0b0000011(3),对于3位使用0b0000011(7),等等。通常,对于
k
嵌入的位,您需要掩码2**k - 1
。在而且,
cv2.imread()
将生成一个像素的numpy数组。您可以将计算矢量化,而不是遍历每个像素。总而言之,这就是你的代码可能的样子。在相关问题 更多 >
编程相关推荐