首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

伪 “Photoshop”的图像处理

伪 “Photoshop”的图像处理

加载ing

(一)引语

如题所示,伪“PS”不是要我们真的去做一个软件,而是根据我们的需要处理图片,比如说像如下这样:

我们只需要实现一个能够对一张图片做处特效处理的程序即可。

(二)我们需要做什么

无论是高级的效果,还是普通的效果(模糊,锐化,边缘检测),其核心部分都是对图像数据的像素处理。其步骤如下:

01

解析图片文件

02

对得到的数据进行处理

03

生成处理后的图片文件

首先,

要解析图片文件,

就应该了解图片文件的格式。

我们学了计算机导论,

都知道图片文件是由相机经过“采样量化”等信号离散化处理后所得的数字信号。

在未压缩时

(如raw格式或无压缩的bmp位图格式)

里面主要储存着像素。

(三)关于像素与图像

简单说,

计算机中显示的图片,

是由一个个被称为像素的方格子组成的,

所有的像素组合起来就能够呈现出一幅图片。

因此放大图片容易造成失真。

对非矢量图的处理,

其实是对像素的处理,

一般而言,

每种类型的图片,其像素储存的信息也不同

01

对于黑白图片,其每个像素只储存0或1,0为黑色,1为白色。

02

对于灰度图片,则根据更复杂的不同灰色深度来调整图像

03

真彩图片由红绿蓝(RGB)三个基本色相互协调组成

(四)关于图片格式

这里AgTao同学使用Ultraedit读取二进制文件,据说WinHex或许功能更多,这里就不细谈了。

AgTao同学用它打开了一张示例图片,看到的二进制数据如下:

Emmm,更复杂了……

不过我们不是全部都要了解,

这里我们只需要是在土黄色光标往左四个字节的数字来作为地址。

在我们的文件里面,

最后四个是:十六进制数【36 00 00 00】,

然而这个数应该理解为【00000036】。(详情见原文)

00000036(16进制)换成十进制是54,

也就是从头开始,

经过54个字节之后就是我们的实际像素数据:

从被选中的02开始

这里插入说明一下AgTao同学所用的图片格式,AgTao同学用的是bmp 24位真彩格式。

//24bpp-RGB:24bpp的位图又称为真彩位图,它通常只有这一种编码格式,在24bits中,低8位表示Blue分量;中8为表示Green分量;高8位表示Red分量。

也就是,

每三个字节代表一个像素,

第一个是B通道

第二个是G通道

第三个是R通道

也就是说我们的图片中

第一行第一列的像素(1,1)是

B-0x02-2

G-0x02-2

R-0x02-2

用PS查看一下是什么颜色:

好吧是黑色

再找其他的

B-0XF9-249

G-0xFF-255

R-0x75-117

青色!

根据这个原理,

图片只要改动像素,

图片就能变成任意模样

没错,只能修改像素并没有什么用,

但是这却是理解接下来“自制PS”的基础知识

(五)关于图片修改

图片修改的操作当然不是直接修改二进制码啦!

这样太复杂了。

我们需要别的方法实现修图。

01

编程修图:这时C/C++就派上用场了(详情见原文)。

02

使用Matlab(适合编程经验不足的初学者)

我们就第二种方法进行讨论:

两层循环生成一个渐变的图片:

图像显示出来了

这个是你自己“制作”的第一张图片!

修改一些参数,

可以有其他更好看的效果,

里只是一个示范,

回到正题,

我们要修改图片,

当然要先载入图片;

先定位到图片所在目录,再使用imread(filename)函数读取并解析图片数据,放到一个变量I里面:

//imread是计算机语言中的一个函数,用于读取图片文件中的数据。在matlab的命令窗口中输入doc imread或者help imread即可获得该函数的帮助信息。

比如说,我要它变模糊,应该怎么处理呢?

这里需要用到一个数字信号处理的基本运算——卷积运算。这里就不再展开了,

有兴趣的同学可以查阅资料,

这里不理解不阻碍使用。

例如:

(1)

先使用

-1 -1 0

-1 0 1

0 1 1

作为卷积核

得到图像如下

(2)

使用

1 1 1

1 7 1

1 1 1

强调边缘卷积核

(3)

使用边缘检测【好像是图像识别的一个前置步骤】

(这个算法和卷积核比较复杂,就不详细给出了)

(4)

高反差(这个要配合一些其他的算法)

基本上就是这样,

以上的原理和过程

采用C/C++、JAVA之类的语言进行工程开发,

自己设计一下界面之类的,“自制PS”就完成啦!

(六)结束

希望在这方面有兴趣的同学能够在阅读本文后对DIP入门有所帮助

(AgTao同学最近也才刚入门,可以一起交流交流),

没有理解的同学也不用着急,

AgTao同学近期会把学习DIP的日记放在博客中,

欢迎前来交流。

以上,

便是AgTao同学的论述。

不知道大家是否受益匪浅呢?

如果大家还觉得不够过瘾,

可以搜索下面连接进入AgTao同学简书原文阅读。

也欢迎大家在他的简书中交流。

http://t.cn/RnpLkSx

撰写:软协技术部 AgTao

编辑:软协信宣部 xin

排版:软协信宣部 小pang

校对:软协信宣部 小七 & 瓶子

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180325G0NS0A00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券