一种简单的图像隐写

其实看完摘要,基本上原理就已经很明白了,就是通过一个全偶数的“刻板”,将刻字内容刻在上面就是把对应的地方改成奇数。提取的时候把奇数部分“翻印”出来就行了。下面看一下实现。

step1:找到一张图片[BMP格式],并将其所有的R通道值改成偶数

为什么非得是bmp?我昨天也被图片格式给整了一把,简单来说,在我们比较熟知的集中图片格式中,如png、jpeg、bmp,只有bmp是无压缩的,我们可以精准的控制像素值。jpg图像由于受到的压缩的影响,像素值有1-3的波动,这还怎么搞啊。。。昨天我用PIL搞了一下午都在奇怪为什么图片保存后,像素值不是我设定好的。怒了就用C读取bmp图片试了一下成功了(纯c就能很简单的解析bmp),发现可以正常实现,就想到了图片格式这个梗。对于图片格式的细节我不想去细细研究,我就想得到图片的数据矩阵,改变矩阵值。所以就用bmp图片了。

伪代码如下:

for i in range(w):
    for j in range(h):
        if img[i,j,R] %2 != 0:
            img[i,j,R] = img[i,j,R]+1 if img[i,j,R] <2 else img[i,j,R]-1

step2:在意个白色的图片上写上黑色的文字[同样是bmp]

step3:通过读取写有隐藏信息的图片的像素值,将载体图片同等坐标的R像素值改成奇数

 for i in range(w):
    for j in range(h):
        if code[i,j,R] == 0 and code[i,j,G] == 0 and code[i,j,B] == 0:
            img[i,j,R] += 1

解码:

遍历有隐藏信息的图片,寻找R值为奇数的坐标;在空白图片对应的坐标设置一种颜色

for i in range(w):
    for j in range(h):
        if img[i,j,R] %2 != 0:
            out[i,j,R]=255
            out[i,j,G]=255
            out[i,j,B]=255

完整的代码(Python+OpenCV2,其实就是用了一下读取、更改像素的功能)

隐藏信息:

#coding:utf-8
import cv2
import numpy as np
# import random
img = cv2.imread("lena.bmp")
code = cv2.imread("code.bmp")
w,h = img.shape[:2]
# print w,h
for i in range(w):
    for j in range(h):
        if img[i,j,2] %2 != 0:
            img[i,j,2] = img[i,j,2]+1 if img[i,j,2] <2 else img[i,j,2]-1
# cv2.imwrite("quanou.bmp",img)
for i in range(w):
    for j in range(h):
        if code[i,j,0] == 0 and code[i,j,1] == 0 and code[i,j,2] == 0:
            img[i,j,2] += 1
cv2.imwrite("final.bmp",img)

提取信息:

#coding:utf-8
import cv2
import numpy as np
img = cv2.imread("final.bmp")
out = np.zeros(img.shape,np.uint8)
w,h = img.shape[:2]
for i in range(w):
    for j in range(h):
        if img[i,j,2] %2 != 0:
            out[i,j,0]=255
            out[i,j,1]=255
            out[i,j,2]=255
cv2.imwrite("out.bmp",out)

顺便吐槽一下。OSCHINA的博客编辑也真是弱爆了,只支持jpg格式,每次编辑还TM只能上传一张照片,编辑还卡的没法

时间: 2024-08-26 16:55:28

一种简单的图像隐写的相关文章

四种简单的图像显著性区域特征提取方法-----&gt; AC/HC/LC/FT。

四种简单的图像显著性区域特征提取方法-----> AC/HC/LC/FT. 分类: 图像处理 2014-08-03 12:40 4088人阅读 评论(4) 收藏 举报 salient region detec显著性检测 laviewpbt  2014.8.3 编辑 Email:[email protected]   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以下将研究的一些收获和经验共享.      先从最简单的最容易实现的算法说起吧: 1

一种简单的图像修复方法

该方法可以用于美颜中的祛斑,通过快速迭代的方式去除斑点. 假设输入图像为: 计算方向权重: 对于其他方向,操作类似We. 最终的输出为: 对要修复的区域,反复进行同样的操作即可. 简单的matlab仿真代码如下: clear clc close all % 设定迭代次数 iter=100; InputData = imread('anish.jpg'); InputData = rgb2gray(InputData); InputData = double(InputData); [height

简单的图像显著性区域特征提取方法-----opencv实现LC,AC,FT

https://blog.csdn.net/cai13160674275/article/details/72991049?locationNum=7&fps=1 四种简单的图像显著性区域特征提取方法-----> AC/HC/LC/FT. 上文讲了几种简单的方法,显著性检测就是把一幅图像中最吸引人注意的部分提取出来. 我用opencv重写了LC,AC,FT三种算法,代码和效果如下: 利用频谱来做的显著性提取的方式 1.,后面的方法其实大概都是基于这个实现的,代码样子差不多 LC思路就是利用对

四种比较简单的图像显著性区域特征提取方法原理及实现-----&gt; AC/HC/LC/FT。

laviewpbt  2014.8.4 编辑 Email:[email protected]   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以下将研究的一些收获和经验共享. 先从最简单的最容易实现的算法说起吧: 1. LC算法 参考论文:Visual Attention Detection in Video Sequences Using Spatiotemporal Cues. Yun Zhai and Mubarak Shah.  Pa

隐写技巧——利用JPEG文件格式隐藏payload

0x00 前言 继续对图片隐写技巧的学习,这次是对JPEG文件格式的学习和理解.同PNG文件的格式对比,JPEG文件相对简单,读取其中隐藏payload的方式大同小异,两者区别在于文件格式不同,可供利用的细节存在差异. 本文相关工具: 16进制编辑器:Hex Editor 隐写检测:Stegdetect 下载地址: https://github.com/abeluck/stegdetect 编辑Exit信息:MagicEXIF 下载地址: http://www.magicexif.com/ 分析

四道图片隐写题

第一题 打开压缩包得到的是一张PNG格式的图片 首先拖放到010Editor中: CTRL+F 搜索IHDR发现只有一个,没有其他问题 然后放到KALI中分析一波: 图片能够在kali中打开,说明不是宽高的隐写,因为如果修改了宽高在linux中是无法正常显示的 然后binwalk分析一波: 同样的没有什么问题 最后就是放到 stegslove里面试一试了 简单的科普一下png的知识 png支持RGBA四个通道,每个通道占8个二进制位,隐写文件或数据一般都在各个通道的低位,因为低位的变化不会引起较

ctf之隐写工具篇

0x00 Stegdetect Stegdetect程序主要用于分析JPEG文件,可以检测到通过JSteg.JPHide.OutGuess.Invisible Secrets.F5.appendX和Camouflage等这些隐写工具隐藏的信息 1,安装 windows安装文件我没找到.我在kali安装Stegdetect比较简单apt-get install stegdetectOutGuess安装:https://github.com/crorvick/outguess.git./config

文顶顶 iOS开发UI篇—iOS开发中三种简单的动画设置

iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView beginAnimations:nil context:nil]; //设置动画时长 [UIView setAnimationDuration:2.0]; self.headImageView.bounds = rect; // commitAnimations,将beginAnimation之后的所

iOS开发UI篇—iOS开发中三种简单的动画设置

iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView beginAnimations:nil context:nil]; //设置动画时长 [UIView setAnimationDuration:2.0]; self.headImageView.bounds = rect; // commitAnimations,将beginAnimation之后的所