首页 > 其他分享 >图像隐写术

图像隐写术

时间:2023-07-18 20:13:19浏览次数:48  
标签:return int 隐写术 unsigned char sur 图像 data

图像隐写术

本文为图像的隐写提供了一种思路。还有更多的思路,这里不做讲述。

项目源代码在:jeefies/jimg-ivs 中。

目录

原理

利用了像素近似用肉眼难以察觉的前提(这就是为什么 jpeg 会存在……

以及 png 图片会原滋原味的保留像素数据,而不是像 jpeg 一样神秘的变化。

而这里并没有采用利用 8bit 像素最后几位来保存数据的方式,而是采用字体渲染,只在某一个颜色通道中展现文本(只读)。

所在通道中的每一个 8bit 位中,有 64 个取值表示被渲染的像素。

也就是说,要做一个近似处理。

至于如何渲染……利用了 SDL_ttf 来完成这件事。

实现

这次我没有继续使用 dlang 写这个小小的项目。而是纯纯只用了 C++,主要是比较方便,因为不仅使用了 SDL,还使用了 opencv,实在是不想封装一层。

Canvas

这是用来渲染文本的东西。由于一行能显示的文本有限,所以需要适当的裁剪。

一一裁剪太慢了,所以考虑倍增求解。

学算法的好处……仅此一点

int len = 0, lg = (int)log2(s.size()) + 1;
for (int step = 1 << lg; step; step >>= 1) {
    if (len + step <= s.size()) {
        int clen = len + step;
        while (clen > len && !checkCompleteUTF8(s.substr(0, clen)))
            --clen;
        TTF_SizeUTF8(font, s.substr(0, clen).c_str(), &sw, &sh);
        if (x + sw < w) len = clen;
    }
}

但是,你可能关注到了 checkCompleteUTF8,这是用于解决中文被截断无法完整渲染的问题(这个参考 utf8 编码方式)

// Important when showing Chinese!
bool checkCompleteUTF8(const std::string &s) {
	char nBytes = 0;

	for (unsigned char c : s) {
		if (nBytes == 0 && c >= 0x80) {
			if (0xFC <= c && c <= 0xFD) nBytes = 6;
			else if (0xF8 <= c) nBytes = 5;
			else if (0xF0 <= c) nBytes = 4;
			else if (0xE0 <= c) nBytes = 3;
			else if (0xC0 <= c) nBytes = 2;
			else return false;
			--nBytes;
		} else if (nBytes) {
			if ((c & 0xC0) != 0x80) return false;
			--nBytes;
		}
	}

	if (nBytes > 0) return false;
	return true;
}

注意,必须要用 unsigned char

近似处理

核心部分。

void invisibleWrite(SDL_Surface *sur, cv::Mat &mat) {
	SDL_LockSurface(sur);

	int w = sur->w, h = sur->h;
	Uint32 * pixels = (Uint32 *)sur->pixels;

	auto threeSumPixel = [](Uint32 cl) {
		return ((cl & 0xFF) + ((cl >> 8) & 0xFF) + ((cl >> 16) & 0xFF)) / 3;
	};

	auto discrete = [](unsigned char x) -> unsigned char { return (unsigned char)((round((double)x / 8)) * 8 - 1); };

	for (int i = 0; i < h; ++i) {
		int base = i * w;
		unsigned char* data = mat.ptr<unsigned char>(i);
		for (int j = 0; j < w; ++j) {
			if (threeSumPixel(pixels[base + j]) > 128) 
				data[j] = discrete(data[j]);
			else if (data[j] == discrete(data[j])) 
				data[j] = data[j] == 0 ? 1 : data[j] - 1;
		}
	}

	SDL_UnlockSurface(sur);
}

其中呢,mat 表示图像分离后的一个通道。使用的 cv::split 函数完成。

相信我写的代码还是不难读明白的……

读入处理

cv::Mat encode(int channel_id = GREEN) {
	cv::Mat newImage;
	if (!_open) return newImage;
	std::vector<cv::Mat> channels;
	cv::split(image, channels);

	showRendered(cvs.getSurface(), 10);
	invisibleWrite(cvs.getSurface(), channels[channel_id]);
	cv::merge(channels, newImage);

	return newImage;
}

这是从 JIVS_Encoder 中截出来的一段代码。


其他部分的代码与上文代码类似……只要理解的上文中的代码,其他部分也就很好写了。

反正我写了这么多封装也就写了 294 行。不多,1 天就可以再写一遍 QwQ


其实吧

这种隐写术很难看破,因为没有对图像二进制文件做出任何的变动,并且像素的近似也是肉眼难以察觉,所以完全可以成为和神秘的人说神秘的话的一种途径吧(就是只能传输文本信息)。

如果要二进制,可能还是利用掩码或者神秘的异或来完成更好。

标签:return,int,隐写术,unsigned,char,sur,图像,data
From: https://www.cnblogs.com/jeefy/p/17563990.html

相关文章

  • python如何保存多个折线的图像
    Python如何保存多个折线的图像引言在数据分析和可视化的过程中,我们经常需要绘制多个折线图来比较不同数据集之间的趋势。Python提供了许多强大的库来进行数据可视化,比如Matplotlib和Seaborn。本文将介绍如何使用Matplotlib来保存多个折线图像。实际问题假设我们有两个数据集:A和......
  • 比Meta「分割一切AI」更全能!港科大版图像分割AI来了:实现更强粒度和语义功能
    前言 比Meta“分割一切”的SAM更全能的图像分割AI,来了!本文转载自量子位仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。CV各大方向专栏与各个部署框架最全教程整理【CV技术指南】CV全栈指导......
  • ON1 HDR 2023 - HDR图像处理mac软件
    ON1HDR2023是一款强大的高动态范围(HDR)图像处理软件,专为摄影师和图像爱好者设计。它提供了一系列功能和工具,使用户能够创建出令人惊叹的HDR照片。→→↓↓载ON1HDR2023mac版 强大的HDR合成:ON1HDR2023采用先进的图像处理算法,能够将多个曝光不同的照片(如曝光正常、曝......
  • ON1 Photo RAW 2023 - mac摄影RAW图像处理软件
    ON1PhotoRAW2023是一款功能强大的专业级照片编辑和管理软件,为摄影师提供了广泛的工具和功能,以实现他们的创意愿景。→→↓↓载ON1PhotoRAW2023mac版 简介和界面:ON1PhotoRAW2023是一款基于订阅模型的跨平台照片编辑软件,适用于Mac和Windows系统。它采用了直观的用......
  • pytorch图像边缘检测
    PyTorch图像边缘检测图像边缘检测是图像处理中的一项重要任务,它可以帮助我们找到图像中不同区域的边界和轮廓。边缘检测在计算机视觉领域有着广泛的应用,如物体检测、图像分割和图像识别等。在本文中,我们将介绍如何使用PyTorch进行图像边缘检测,并提供相应的代码示例。什么是边缘?......
  • pytorch使用(三)用PIL(Python-Imaging)反转图像的颜色
    1.多数情况下就用这个,不行再看下面的fromPILimportImageimportPIL.ImageOps#读入图片image=Image.open('your_image.png')#反转inverted_image=PIL.ImageOps.invert(image)#保存图片inverted_image.save('new_name.png')2.如果图像是RGBA透明的,参考如下代码......
  • 图像腐蚀操作
    1.腐蚀操作腐蚀操作是一种图像处理操作,它可以将图像中的细小或细长的物体变细或变短。它通过将结构元素与图像进行卷积操作,将亮区域被黑色区域所腐蚀,从而减小亮区域的面积。在许多图像处理软件中,腐蚀操作通常作为一个常见的图像处理滤镜或功能提供。在图像形态学处理领域,常......
  • 在 3ds Max 中使用Mental Ray渲染 wip 图像
    推荐:NSDT场景编辑器助你快速搭建可二次开发的3D应用场景本教程面向初学者,每个步骤都详细概述和显示。如果您是3DStudioMAX的新手,您可能想先尝试我们的其他一些教程。使用默认的3DStudioMAX渲染器创建粘土渲染步骤1 在3DStudioMax中启动一个新场景并向场景添加模......
  • 视觉检测系统不丢帧背后的真相——10G高速图像采集卡
    中国机器视觉起步于80年代的技术引进,一直到2011年,市场开始高速增长,随着人工成本的增加和制造业的升级需求,加上计算机视觉技术的快速发展,越来越多机器视觉方案应用于各领域。参差不齐的视觉系统导致机器视觉设备的持续稳定性以及传输数据的准确性也无法得到保障。今天联瑞给大家讲......
  • Capture One 23-RAW图像编辑软件mac/win版
    CaptureOne23是一款专业的RAW图像编辑软件,广泛应用于摄影行业。它提供了丰富而强大的工具和功能,帮助摄影师优化、处理和管理他们的原始图像。→→↓↓载CaptureOne23mac/win版  RAW文件支持:CaptureOne23支持超过500种不同相机的原始RAW文件,包括主流相机品牌如佳能......