图像可变游程之混乱代码

2023-11-04

图像可变游程之混乱编码

这里,对我的自画像代码作一个简要解释。自画像代码实际上是一个解码器。包括两个部分:

  1. 图像的可变游程编码(varied length coding)
  2. 混乱编码(obfuscated coding)
    最关键部分就是那个码表了。这里介绍如何生成一个可变游程之混乱编码后码表。

可变游程编码(VLC)

实际上,我的自画像采用了一个简单的游程编码。其基本原理如下:

  1. 采用最简单的二值图像游程编码,只需要交替数0,1的个数
  2. 偶数字节表示0的长度,奇数字节表示1的长度
  3. 采用ASCII码的字符表示长度,那么实际字节非原始长度编码,而是可显示字符加上0或1的长度所对应的字符

混乱编码

上一节介绍了VLC编码方法,但是有一个问题,每个字节表示的长度是有限的(由于可选用的可显示字符有限)。我们假设其为M。以一个0长度为L(L〉M)的编码为例,由于VLC奇偶分别编码的原因,由于L超过M,所以要先编一个长度为M的偶数字符,然后编一个长度为0的奇数字符,然后再编一个长度为(L-M)的偶数字符。
值得注意的是,表示长度为0的字符,可以从多个字符中随机选择,这就是混乱编码的由来。

参考代码

可以简单用如下编码器生成一个二值bmp图像的可变游程之混乱编码后的字符表了。

int gen_bmp_2bit_vlc_tbl(char *img, FILE *fp) {
	int  i, j, k;
	int  idx;
	int  cnt_bit_flag; // 0: count bit 0 run-length; 1: count bit 1 run-length
	int  force_cnt_bit_flag;
	int  bits_1, bits_0;
	int  max_run_length;
	unsigned char c[16];
	
	// at first, count bit 0
	cnt_bit_flag = 0;
	bits_0 = 0;
	bits_1 = 0;
	max_run_length = 0;
	force_cnt_bit_flag = FORCE_DONE;
	idx = 0;
	for (i=0; i<H; i++) {
		fseek(fp, -(i+1)*W/8, SEEK_END);
		fread(&c, sizeof(unsigned char), W/8, fp);
		for (j=0; j<W/8; j++) {
			for (k = 0; k < 8; k++) {
				if (force_cnt_bit_flag == FORCE_0) {
					cnt_bit_flag = 0;
					assert(bits_1 > 0);
					printf("%c", img[idx++] = bits_1 + MIN_ASCII);
					if (bits_1 > max_run_length)
						max_run_length = bits_1;
					bits_1 = 0;
					force_cnt_bit_flag = FORCE_DONE;
					bits_0 = 0;
				}
				else if (force_cnt_bit_flag == FORCE_1) {
					cnt_bit_flag = 1;
					assert(bits_0 > 0);
					printf("%c", img[idx++] = bits_0 + MIN_ASCII);
					if (bits_0 > max_run_length)
						max_run_length = bits_0;
					bits_0 = 0;
					force_cnt_bit_flag = FORCE_DONE;
					bits_1 = 0;
				}

				if (c[j] & 0x80) {
					if (cnt_bit_flag == 0) {
						cnt_bit_flag = 1;
						if (bits_0 <= 0)
							printf("%c", img[idx++] = (rand() % (MIN_ASCII - OBF_ASCII + 1) + OBF_ASCII));
						else
							printf("%c", img[idx++] = bits_0 + MIN_ASCII);
						if (bits_0 > max_run_length)
							max_run_length = bits_0;
						bits_0 = 0;
					}
					bits_1++;
					if (bits_1 >= MAX_RUN_LENGTH) {
						// force change
						force_cnt_bit_flag = FORCE_0;
					}
				}
				else {
					if (cnt_bit_flag == 1) {
						cnt_bit_flag = 0;
						if (bits_1 <= 0)
							printf("%c", img[idx++] = (rand() % (MIN_ASCII - OBF_ASCII + 1) + OBF_ASCII));
						else
							printf("%c", img[idx++] = bits_1+MIN_ASCII);
						if (bits_1 > max_run_length)
							max_run_length = bits_1;
						bits_1 = 0;
					}
					bits_0++;
					if (bits_0 >= MAX_RUN_LENGTH) {
						// force change
						force_cnt_bit_flag = 1;
					}
				}
				c[j] = c[j] << 1;
			}
		}		
	}
	// force the last out
	if (bits_0 != 0) {
		printf("%c\n", img[idx++] = bits_0 + MIN_ASCII);
		if (bits_0 > max_run_length)
			max_run_length = bits_0;
		bits_0 = 0;
	}
	else if (bits_1 != 0) {
		printf("%c\n", img[idx++] = bits_1 + MIN_ASCII);
		if (bits_1 > max_run_length)
			max_run_length = bits_1;
		bits_1 = 0;
	}	
	return idx;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像可变游程之混乱代码 的相关文章

  • TeamViewer连接密码问题

    最近用VNC连接服务器 只要知道服务器的IP和密码 一直使得顺风顺水 但是最近遇到一个问题 服务器的IP地址获取方式被别人改成了自动获取方式 自此 在使用VNC的路上 我碰到了第一个麻烦 为了解决这个麻烦 我安装了TeamViewer 这个
  • JAVA并发编程实战-任务执行

    目录 思维导图 1 在线程中执行任务 1 1 顺序执行任务 1 2 显式的为任务创建线程 1 3 无限制创建线程的缺点 2 Executor框架 2 1 使用Executor实现WebServer 2 2 执行策略 2 3 线程池 2 3
  • C++小游戏贪吃蛇源码

    graphics h是针对DOS下的一个C语言图形库 c 也可以 目前支持下载此头文件的常用的有两种 1 EGE Easy Graphics Engine 2 EasyX Graphics Library EGE 全名Easy Graphi
  • 请你讲讲wait方法的底层原理

    wait即object的wait 和notify 或者notifyall 一起搭配使用 wait方法会将当前线程放入wait set等待被唤醒 1 将当前线程封装成objectwaiter对象node 2 通过objectmonitor a
  • 在kali环境下安装dvwa

    1 下载dvwa 登陆进去kali 输入 git clone https github com ethicalhack3r DVWA 2 安装DVWA 把下载好得DVWA cp到 var www html 下 给dvwa一个权限 查看一下所
  • 技术革命与金融资本:泡沫与黄金时代的动力学 (美)卡萝塔·佩雷丝着

    这本书总结了科技革命对社会的影响 分析科技革命后什么时间什么条件下对社会造成影响 很不错的一本书 必须推荐啊 2013 9 29
  • harbor 离线同步

    场景 客户环境为离线环境 只能把公司私服的镜像下载后 然后通过客户端中转传到客户的私服上 客户端在客户内网中 然后拨号到公司的内网 bin bash harbor的url URL https 10 27 6 59 31009 源harbor
  • 文件锁

    借助 fcntl函数来实现文件锁机制 操作文件的进程没有获得文件锁时 可以打开文件 但无法执行read write操作 注意 文件锁只能用于进程间同步 fcntl函数 int fcntl int fd int cmd int fcntl i
  • 2022年江西省“网络空间安全”赛项模块B--流量分析(中职组)

    2022年中职组山西省 网络空间安全 赛项 B 6 流量分析任务书及解析 不懂私信博主 一 竞赛时间 420分钟 共计7小时 吃饭一小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第 阶段 单兵模式系统渗透测试 任务一 系
  • 【华为OD机试真题 Python】最差产品奖

    前言 本专栏将持续更新互联网大厂机试真题 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于大厂机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nansun0
  • STM32外设天造地设的一对:ADC和DMA

    STM32外设天造地设的一对 ADC和DMA 引言 这篇文章主要介绍ADC和DMA配置的注意事项 适合懂得如何配置最基本的ADC和DMA 但是对它们两个的模式不是太理解的朋友们看 本文将重点介绍ADC和DMA模式的注意事项 DMA是CPU的
  • Spring Boot 报错org.springframework.jdbc.datasource.embedded.EmbeddedData

    记录一次Spring Boot错误解决方案 如果Spring Boot 在整合druid的时候 如果启动报错 并报以下错误的时候 org springframework beans factory UnsatisfiedDependency
  • 常用决策树模型ID3、C4.5、CART算法

    决策树概述 决策树 decision tree 是一种基本的分类与回归方法 下面提到的ID3 C4 5 CART主要讨论分类的决策树 在分类问题中 表示基于特征对实例进行分类的过程 可以认为是if then的集合 也可以认为是定义在特征空间
  • 计算机图形学期刊和会议

    目录 中国计算机学会推荐国际学术期刊 计算机图形学与多媒体 一 A类 二 B类 三 C类 中国计算机学会推荐国际学术会议 计算机图形学与多媒体 一 A类 二 B类 三 C类 中国计算机学会推荐国际学术期刊 计算机图形学与多媒体 一 A类 序
  • 光纤收发器怎么连?光纤收发器连接图解!

    光纤收发器可以实现光信号和电信号的转换 通过光纤进行信号的转换 最后和一些设备连接 让你的传输通信畅通无阻 当我们远距离传输时 通常会使用光纤来传输 因为光纤的传输距离很远 一般来说单模光纤的传输距离在10千米以上 而多模光纤的传输距离最高
  • C++报错提示某类名不是类或命名空间名称

    在学习C 的友元时 遇到一个问题 两个类互相调用时报错 如图 include
  • 三菱数控CNC系统G代码M代码大全

    G00 快速定位 G01 直线补间切削 G02 圆弧补间切削CW 顺时针 G03 圆弧补间切削CCW 逆时针 G02 3 指数函数补间 正转 G03 3 指数函数补间 逆转 G04 暂停 G05 高速高精度制御 1 G05 1 高速高精度制
  • C++ //STL 简介

    STL简介 STL Standard Template Library 即标准模板库 是一个具有工业强度的 高效的C 程序库 STL的一个重要特点是数据结构和算法的分离 STL另一个重要特性是它不是面向对象的 STL六大组件 容器 Cont
  • 非线性解方程组c语言_08 -- 非线性有限元分析方法

    到目前为止 讨论的都是线性问题 这里采用了两个基本假设 1 材料的应力 应变关系是线性的 D 2 结构的应变 位移关系是线性的 B 非线性有限元分析方法大同小异 以材料非线性为例 1 当材料的应力 应变关系是非线性时 刚度矩阵不是常数 与位
  • 代码管理工具SVN

    svn 什么是svn SVN是Subversion的简称 是一个开放源代码的版本控制系统 相较于RCS CVS 它采用了分支管理系统 它的设计目标就是取代CVS 互联网上很多版本控制服务已从CVS迁移到Subversion 说得简单一点SV

随机推荐

  • 力扣-->#剑指Offer 563 . 二叉树倾斜

    这道题要理解有一定的困难 首先看到这样的题目肯定想到的就是遍历 其次 需要有一个值来记录倾斜度 即 left right 再者 需要一个函数来帮忙辅助计算倾斜度 即findSum class Solution int findSum Tre
  • RIP、OSPF等路由协议严格意义上讲属哪一层?

    1 RIP基于UDP BGP基于TCP OSPF和EIGRP基于IP 这些在TCP IP协议栈中定义的路由协议用于发现和维护前往目的地的最短路径 你可以认为它们不属于网络层协议 注意 是用 based on 而不是实现了 BGP用TCP 所
  • 微信公众号h5页面实现授权,前端部分

    授权步骤 微信开发工具上配置公众号的apiId 微信环境内调起微信的授权功能 代码实现 此段代码放在app vue的监听函数中 每当路由发生变化 都会判断此页面是否已授权 没授权的话则进行授权 watch route handler fun
  • 4. 消息中心的设计与实现

    消息中心的设计与实现 一 引言 运用场景 1 消息的主动提醒 客户端被动接收 2 客户模块 及时通讯 3 单一登录 一个账号只能在一个设备登录 消息中心的实现方案 1 客户端轮询 2 TCP长连接 常用 Java的长连接的方案 Java B
  • windows命令行下ftp连接超时的可能原因

    1 需要连接的主机没有启用ftp服务 iis没有建立ftp站点 ftp身份验证设置不当 详情参考博文 windows下使用ftp 以及 windows开启ftp服务 两篇博文有重复的部分 我将他们取并集操作了一遍 另外 我还处理了iis未授
  • 使用Visual Studio编译ffmpeg

    一 首先参照下面的链接配置和编译 FFmpeg在VS2017下的编译 vs2017 ffmpeg源码编译 鱼儿 1226的博客 CSDN博客 vs2019编译ffmpeg源码为静态库动态库 完整步骤 亲测可行 ffmpeg vs 令狐掌门的
  • 嵩天老师-Python语言程序设计-Python123配套练习测验题目汇总整理

    测验1 Python基本语法元素 知识点概要 普遍认为Python语言诞生于1991年 Python语言中的缩进在程序中长度统一且强制使用 只要统一即可 不一定是4个空格 尽管这是惯例 IPO模型指 Input Process Output
  • 求最长不含重复字符的子字符串——C++

    声明 本文原题主要来自力扣 记录此博客主要是为自己学习总结 不做任何商业等活动 一 原题描述 剑指 Offer 48 最长不含重复字符的子字符串 请从字符串中找出一个最长的不包含重复字符的子字符串 计算该最长子字符串的长度 示例 1 输入
  • Linux查看进程命令

    查看进程 1 ps 命令用于查看当前正在运行的进程 grep 搜索 例如 ps ef grep java 表示查看所有进程里 CMD 是 java 的进程信息 2 ps aux grep java aux 显示所有状态 ps 3 kill
  • Sublime Text4 配置 Python3 环境、代码提示、编译报错教程

    1 配置 Python3 环境 单击 工具 gt 编译系统 gt 新建编译系统 弹出 替换里面的内容为 cmd G CodeTools anaconda3 python exe u file file regex File line 0 9
  • 数据中台数据分析过程梳理

    在当今社会中 随着企业的快速发展 相关业务系统的建设也会越来越多 新的业务模式 新的IT架构 多云环境的出现等等 而一些问题就逐渐暴露了出来 企业之间的IT无法做到互通 新模式生产数据与旧数据无法互通 企业IT架构错综复杂 底层数据互通更加
  • java使用opencv库二值化图片

    应用场景 截取监控视频图片保存到本地后用作后期监控视频角度调整参考 使用二值化后的图片并进行透明度降低进行监控矫正 package img import java awt Color import java awt image Buffer
  • delphi XE5如何把其它程序而不是本软件在通知区域的图标隐藏?不是关闭进程。请举个详细例子,比如Shell_NotifyIcon...

    Delphi XE5可以使用API函数Shell NotifyIcon来实现隐藏其它程序的图标 具体代码例子如下 procedure HideIcon APid Cardinal var noteIconData TNOTIFYICONDA
  • 关于 hostapd

    关于 hostapd 主页 http w1 fi hostapd hostapd是一个IEEE 802 11的AP和IEEE 802 1X WPA WPA2 EAP RADIUS验证器 此页面用于怎么在linux系统下使用它 其他操作系统请
  • 金融贷款行业实时高精准获客 ——三网运营商大数据

    都说生产是第一因素 但对于任何企业来说 客户来源才是第一因素 在大多数行业 获得客户的困难已经成为行业的挑战 如今 许多行业和企业获得客户的主要来源是在线促销和客户获取 现在几乎每个人都有一部手机 运营商可以根据移动客户的访问行为 通信行为
  • 排查java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException:***

    首先排查 vi etc sysconfig network 没有就加上 HOSTNAME 你的主机名 XXXX 如果有 接着排查 vi etc hosts 没有就加上 127 0 0 1 localhost localdomain loca
  • 2021年全球与中国高速分散机行业市场规模及发展前景分析

    2021年全球与中国高速分散机行业市场规模及发展前景分析 本报告研究全球与中国市场高速分散机的发展现状及未来发展趋势 分别从生产和消费的角度分析高速分散机的主要生产地区 主要消费地区以及主要的生产商 重点分析全球与中国市场的主要厂商产品特点
  • 论文阅读:DeepFake-Adapter: Dual-Level Adapter for DeepFake Detection(Deepfake模型快速调参)

    一 论文信息 论文名称 DeepFake Adapter Dual Level Adapter for DeepFake Detection 作者团队 项目主页 https github com rshaojimmy DeepFake Ad
  • python爬取 百姓网部分数据 + 存入MongoDB数据库详细案例

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 前言 一 实施步骤 二 目标网站 先分析目标网站 三 获取数据 1 引入库 2 请求数据 2 1 获取第一层链接 3 抓取数据 3 1 分析页面 3 2 抓取数据 四
  • 图像可变游程之混乱代码

    图像可变游程之混乱代码 图像可变游程之混乱编码 可变游程编码 VLC 混乱编码 参考代码 图像可变游程之混乱编码 这里 对我的自画像代码作一个简要解释 自画像代码实际上是一个解码器 包括两个部分 图像的可变游程编码 varied lengt