Image Filter and Recover
这是CS50的第四次大作业,顺便学习了图像的入门知识。
基础
黑白图(bitmap)的每个像素点只能取值0/1,1代表白色,0代表黑色。
常见的图片格式有JPEG/PNG/BMP,这些格式都支持RGB,每个像素点可以用多个bit表示,常见的是24-bit,红、绿、蓝分别由8bit表示,范围0~255。
BMP图的开始位置有两个header,第一个叫BITMAPFILEHEADER
,14B;第二个叫BITMAPINFOHEADER
,40B。接下来的每个像素点是按照BGR的顺序存储的。
过滤器
Image Filter就是对原图的像素点的像素进行操作,得到一幅新图。主要有下面几种:
- Grayscale
将RGB图变为灰度图。将每个像素点的R/G/B的值改为相同,值越大,亮度越大。一般取三色的平均值。 - Sepia
比较像怀旧滤镜,有很多算法可以做,主要就是对3种颜色乘一些系数,做一些加减运算。 - Reflection
左右翻转。 - Blur
图像模糊,对每个像素点的每种颜色,取其周围3*3格子的平均值。 - Edges
边缘检测,可以用Sobel Operator去做:
Blur是对周围的格子取平均,Sobel是求一个加权和,对于x和y方向,有两个kernel:
对每个像素点的每种颜色,用周围3*3格子的对应颜色分别去乘Gx/Gy,得到加权和sumx/sumy。
以x为例,如果左右两边差不多,那么加权和接近0,否则得到一个大正数/负数,说明很有可能是两个物体的分界。
综合考虑x和y方向,取\(\sqrt{sumx^2+sumy^2}\),再四舍五入到0~255之间。
对于边缘的格子,可以做padding,围一圈全黑(0)的格子,相当于不用计算。
图片恢复
JPEG的前三个字节分别是0xff, 0xd8, 0xff
,第四个字节的前四位是1110
,这些可以唯一标识JPEG文件。
记忆卡上所有图片是连续存储的,最小单位每块512B,不到一块的后面补0,不影响显示,每张图片可能占若干块。
可以每次读512B扔到buffer里,如果是jpeg,就将其写入新文件、继续读512B,直到遇到下一个jpeg。
Image Filter and Recover的更多相关文章
- dereverberation
Typical Approach to Dereverberation DOAs Estimating the directions of arrival of a direct source sig ...
- django 操作数据库--orm(object relation mapping)---models
思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...
- 【Go入门教程3】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)
这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...
- Go Revel - Filter(过滤器)源码分析
在 Go Revel - server.go 源码分析 http://www.cnblogs.com/hangxin1940/p/3265538.html 说到revel框架很多重要的东西都Filte ...
- 【Go入门教程5】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)
这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...
- gitattributes中的filter
.gitattributes文件就是一个简单的text文本文件,它的作用是gives attributes to pathnames. 该文件中的一些配置可以为某些特定目录或者文件来设置,这样Git就 ...
- Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
什么是流处理 如果有 java 使用经验的同学一定会对 java8 的 Stream 赞不绝口,极大的提高了们对于集合类型数据的处理能力. int sum = widgets.stream() .fi ...
- JavaWeb——Filter
一.基本概念 之前我们用一篇博文介绍了Servlet相关的知识,有了那篇博文的知识积淀,今天我们学习Filter将会非常轻松,因为Filter有很多地方和Servlet类似,下面在讲Filter的时候 ...
- 以bank account 数据为例,认识elasticsearch query 和 filter
Elasticsearch 查询语言(Query DSL)认识(一) 一.基本认识 查询子句的行为取决于 query context filter context 也就是执行的是查询(query)还是 ...
随机推荐
- 【php】COOKIE和SESSION
一. COOKIE(小甜点,小饼干) a) 生活中的实例: i. 大保健的会员卡(记录你的姓名.性别.ID号码.手机号……) ii. 超市的会员卡(记录你的姓名,性别,会员积分) b) PHP当中的实 ...
- 【高并发】你知道吗?大家都在使用Redisson实现分布式锁了!!
写在前面 忘记之前在哪个群里有朋友在问:有出分布式锁的文章吗-@冰河?我的回答是:这周会有,也是[高并发]专题的.想了想,还是先发一个如何使用Redisson实现分布式锁的文章吧?为啥?因为使用Red ...
- MTK Android 计算器Calculator输入暗码!77!+,启动工厂测试apk
Android8.0 计算器Calculator输入暗码!77!+,启动工厂测试apk 路径: packages/apps/ExactCalculator/src/com/android/calcul ...
- LARAVEL快速入门
一.查询 $map = []; $map[] = ['u.store_id','=',0]; $map[] = ['u.reg_time','<',time()]; $map[] = ['u.u ...
- 30.3 Collections 集合体系的工具类
/* * Collections: * 面试题:Collection和Collections有什么区别? * Collection是集合体系的最顶层,包含了集合体系的共性 * Collections是 ...
- mysql 多个属性排序查询
查询 排序(order by) 语法:order by 字段 asc/desc asc 顺序,正序.数值 :递增,字母:自然顺序(a-z) desc 倒序 反序 数值:递减, 字母:自然反序 查询的宗 ...
- Redis学习一:Redis两种持久化机制
申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 Redis是基于内存来实现的NO SQL数据库,但是我么你都 ...
- ******Prometheus(二)***********
Prometheus的数据与安全模型: (1)Metric (度量)名字就是描述采集数据的名称——例如,website_visits_total 作为网站访问总数.名称可以包含ASCII字母.数字.下 ...
- Android MonkeyTalk测试
Android MonkeyTalk测试 MonkeyTalk可以用于压力测试,正因为这点所以才选择MonkeyTalk进行测试,相对于Monkey测试,目前个人发现的有点在于,MonkeyTalk是 ...
- 【DataBase】 在Windows系统环境 下载和安装 解压版MySQL数据库
MySQL官网解压版下载地址:https://dev.mysql.com/downloads/mysql/ 为什么不推荐使用安装版?无脑下一步,很多配置的东西学习不到了 点选第一个就好了,下面的是调试 ...