使用Python实现Histogram_equalization算法

最近刚来日本忙着生活上的事情,对技术上的研究也有点松懈了.在日本的研究课题是计算机图形学.所以就选修了相关的课程, 最基本的当然是图形处理,老师的第一个任务就是实现 Histogram equalization 算法.中文名字就是直方图均衡化.

# 概念介绍

这里首先讨论的是灰阶的图像,也就是平常大家所有的黑白照片.然后每个颜色都有具体的数值.纯黑色是 0,纯白色是 255. 当然这是对于 8 Bit 的图来说的. 色差的范围只有 0-255.就拿这个作为例子来讲解吧~ 然后就要讲解如何从数值上来分析一张图片是拍的好呢还是不好呢,如果是一张好照片,那这张照片必然是 对比度鲜明,该亮的地方亮,该暗的地方暗.也就是大家所说的曝光合适.然后我们从照片的二进制数据中去读取每个像素的数值,然后画出直方图.发现每个数值的 像素分布比较均匀,就说明这是一张好照片.但是现实生活中,我们可能会拍到一些曝光不足导致整体照片很暗或者曝光过了导致照片过亮的情况.在不能重拍的情况 下只能使用算法来进行优化了,本文就是来说明这个算法的实现的.

# 算法大致概念

算法的本质就是提取每个像素的数值,然后经过计算把每个像素进行替换.每个像素都有经过计算之后的新的数值.新的数值可以使照片整体上的数值分布更均匀. 给人的整体感觉是照片对比度变得很好了.具体的算法解释看 wiki 我解释的比较烂. Histogram_equalization (opens new window)

# 算法实现

根据 wiki 的例子,我用 Py 实现了这个算法,效果还算不错吧.尽可能的少引用类库,不过 opencv 已经有现成实现好的 API 了.但是只支持 Py2,而我用的 Py3. 库的引用只使用了PIL (opens new window)numpy (opens new window).前者用来读取图像的二进制数据, 后者用来进行数值的累加计算.源码发布在 Github (opens new window)

计算机图形学对我来说完全是未知的领域,希望有经验的同学可以不吝指正.

Chrome扩展和Web Page 进行通讯

由于 WEB 页面本身受到浏览器的安全策略限制,而且 Content Scripts 和页面本身并不共享环境变量.我们很多时候都是 通过 DOM 去注入 JS 代码到当前页面上.因为同源策略的原因不得不把有些操作发回到 Background 进行处理,因为 Background 没有任何限制,可以拥有完整的 Chrome 的 API 权限.

# 通过 Content Scripts 中转

第一种通讯方式是通过 Web API postMessage (opens new window) 发送消息,然后在 Content Scripts 监听 message 事件捕捉消息发送回 Background 这种方式适合单向通讯,只从 web page 发送数据到 Background 或者 Background 发送给 web page 如果双向通讯的话就很不方便了 因为 Content Scripts 和 web page 共享 window 会造成事件重复绑定的.

# 使用 Chrome API

首先在 manifest.json 里声明权限

"externally_connectable": {
  "matches": ["*://*.example.com/*"]
}
1
2
3

声明要通讯的网页的网址,然后和 Content Script 一样建立通讯

var port = chrome.runtime.connect(chrome_id, { name: 'abc' });
port.postMessage({
  method: 'rpc_data',
  data: parameter
});
port.onMessage.addListener(function(response) {
  SetMessage(response[0], response[1]);
});
1
2
3
4
5
6
7
8

关键是 Background 监听消息的接收,必须使用 chrome.runtime.onConnectExternal.addListener 而不是 chrome.runtime.onConnect.addListener 后者是接收 Content Script 消息的,前者是 接收 Web Page 消息的. 这样便实现了 Web Page 和 Background 之间的双向通讯, Web Page 不能完成的事情交给 Background 来处理即可.

# 参考

官方文档 (opens new window)

解压和打包安卓DAT文件

安卓 5.0 的卡刷包系统基本上都是在一个 dat 文件里面的。但是对于很多国内 ROM,要不就是植入了很多流氓软件, 要不就是有很多无用软件。我们可以通过解压 DAT 文件并进行修改然后再封装回去就完美啦~

# 首先把 DAT 解压成 IMG 镜像

我们要使用sdat2img (opens new window)工具把 DAT 文件转换成 IMG 镜像

./sdat2img <transfer_list> <system_new_file> <system_ext4>
- <transfer_list> = input, system.transfer.list from rom zip
- <system_new_file> = input, system.new.dat from rom zip
- <system_ext4> = output ext4 raw image file
1
2
3
4

一个很简单的例子:

./sdat2img system.transfer.list system.new.dat system.img
1

新生成的 IMG 镜像便是我们下一步需要的.

# 挂载 IMG 镜像

sudo mount -t ext4 -o loop system.img /mnt/android
1

这时候你可以在系统的 /mnt/android 目录下看到文件的具体内容然后进行修改了.

# 打包回 IMG 镜像

把修改好的内容打包回去需要使用make_ext4 (opens new window)工具

./make_ext4fs -T 0 -S file_contexts -l 1073741824 -a system system_new.img /mnt/android
1

file_contexts 文件是 ROM 本身提供的.后面的一串数字指的是打包的 IMG 文件的大小 1G

# 封装成 DAT 文件

封装仍需要使用工具 使用 rimg2sdat (opens new window)

./rimg2sdat <system_img>
1

这样就打包好了新的 DAT 文件,放入刷机 ROM.刷机即可~ 以上操作最好在 Linux 环境下,Win 下不保证成功.

# 参考

XDA (opens new window)