这是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的更多相关文章

  1. dereverberation

    Typical Approach to Dereverberation DOAs Estimating the directions of arrival of a direct source sig ...

  2. django 操作数据库--orm(object relation mapping)---models

    思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...

  3. 【Go入门教程3】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)

    这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...

  4. Go Revel - Filter(过滤器)源码分析

    在 Go Revel - server.go 源码分析 http://www.cnblogs.com/hangxin1940/p/3265538.html 说到revel框架很多重要的东西都Filte ...

  5. 【Go入门教程5】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)

    这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...

  6. gitattributes中的filter

    .gitattributes文件就是一个简单的text文本文件,它的作用是gives attributes to pathnames. 该文件中的一些配置可以为某些特定目录或者文件来设置,这样Git就 ...

  7. Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据

    什么是流处理 如果有 java 使用经验的同学一定会对 java8 的 Stream 赞不绝口,极大的提高了们对于集合类型数据的处理能力. int sum = widgets.stream() .fi ...

  8. JavaWeb——Filter

    一.基本概念 之前我们用一篇博文介绍了Servlet相关的知识,有了那篇博文的知识积淀,今天我们学习Filter将会非常轻松,因为Filter有很多地方和Servlet类似,下面在讲Filter的时候 ...

  9. 以bank account 数据为例,认识elasticsearch query 和 filter

    Elasticsearch 查询语言(Query DSL)认识(一) 一.基本认识 查询子句的行为取决于 query context filter context 也就是执行的是查询(query)还是 ...

随机推荐

  1. ubuntu上安装lamp环境命令清单

    #install configuration manager sudo apt-get install tasksel #install basic lamp stack sudo tasksel i ...

  2. Vulnhub FristiLeaks靶机渗透

    VM上配置 VMware users will need to manually edit the VM's MAC address to: 08:00:27:A5:A6:76 VM上选择本靶机,编辑 ...

  3. 《操作系统》课程笔记(Ch01-导论)

    Ch01 - 导论 操作系统的功能 用户视角:在乎使用方便,不在乎资源利用 系统视角:资源分配器.控制程序 计算机系统的运行 启动:利用固件(Firmware)中的引导程序(Bootstrap Pro ...

  4. 抽签小程序,妈妈再也不用担心谁洗碗(分配任务)了,so easy

    背景 今天谁炒菜,谁洗碗,谁买菜...啊,Boss说用抽签吧,于是有了下图 这样存在作弊的问题(记住棍子特征,谁先,谁后抽等等)于是有了这个抽签小程序(当然小程序我一个人控制,我想不想作弊看心情了) ...

  5. Git中rebase失败了如何进行恢复

    rebase失败后的恢复 记一次翻车现场 记一次翻车的现场,很早之前提的PR后面由于需求的变便去忙别的事情了,等到要做这个需求的我时候,发现已经 落后版本了,并且有很多文件的冲突,然后就用rebase ...

  6. stand up meeting 1/18/2016

    part 组员                工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云  准备最后的发布和整个开发的整理总结    6 release ...

  7. stand up meeting 12-2

    今天因为各位组员组里项目原因没有集中在一起进行stand up meeting.但是士杰和天赋国庆分别对项目进度和前后端的结合进行的沟通. 针对后端部分,天赋完成了GetRankingData API ...

  8. Gatling脚本编写技巧篇(二)

    脚本示例: import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.durati ...

  9. api_DZFPKJ & api_DZFPCX(get_AES_url代码优化)

    通过AES加密网站的接口来传值,不需要手动加密字符串后复制过来传值. #coding:utf-8 import requests import re def get_aes_url(key, text ...

  10. PHP常量:JSON_UNESCAPED_UNICODE

    函数: json_encode() - 对变量进行 JSON 编码 说明: json_encode ( mixed $value [, int $options = 0 [, int $depth = ...