IP_MOOC_Section_02
0 (0 Likes / 0 Dislikes)
欢迎来到图像处理入门的第二节
这一节里我会介绍一些
控制图像亮度和颜色的操作
让我们开始吧,这里有一张示例图片
你可以对这张图片做许多事情
其中的一种是让图片更亮
这可以通过使用 Lighter 函数来完成
Lighter 让图片看上去更亮一些
Lighter 函数也可以接受第二个参数
它指定了图片变亮的程度
这里展示了它的效果
其中第二个参数被设置成 1/3
也就是第二参数的默认值
这里战术了设置为1的效果
让图片看上去明显更亮了
一种观察变量造成的结果(比如说Lighter函数的第二个参数)
的方便的方法
是去写一个简短的 Manipulate 程序
来提供一个交互式的滑条调整变量的值
比如说,这段程序使用了Manipulate
来获得一个在Lighter函数中
调整第二个参数的滑动条
第二个参数的范围从0到1
0保持图片不变化
而1在相当程度上让图片变亮
Lighter 函数的功能实现的原理是
使计算机内部表示图像的数的数值更大
使计算机内部表示图像的数的数值更大
计算机内部用来表示图像的实际数字集
称为图像数据
图像本身是被称为像素的点的阵列
ImageDimensions 函数显示下面的图像
是由182 x 128个像素组成
在计算机中,每个像素
由一组称为像素值的数字表示
像素值的数组是图像的数据。
这个输入使用了 ImageData 函数
来显示这个图像的图像数据
Lighter 函数中的第二个参数
指定了那些数字的增长幅度
这里展示了指定Lighter函数的第二个参数为1之后的
生成图像的图像数据
将原始图像的前几个数字
与较亮的图像的前几个数字进行比较
可看出较亮图像的
图像数据中的数字较大
比如说这种图片,它的图像数据是一个数组
比如说这种图片,它的图像数据是一个数组
它的维度是 128x182x3
这个数组之所以具有第三个维度3
是因为每个像素值都由三个数字表示
而其他两个维度
给出了图像的高度和宽度
这里要注意的一件事是
图像的高度和宽度尺寸
以相反的顺序给出
这样的区别仅仅是习惯的问题
在图像中,通常先给出列数
而在数组中,先给出行数
这种差异通常不是大问题
但是在处理图像数据时要牢记这一点并保持注意
即使对这张小图片
图像数据也含有大约7万个数
这当然是很多数字
通过放大获取更易于管理的图像的部分
更容易理解这些数字
这是另一幅由2x2像素阵列
组成的图像
该图像的图像数据
显示为2x2像素值的数组
在此图像中,每个像素值都是三个数字组成的列表(List)
用于指定该像素的颜色
该图像使用了所谓的RGB颜色空间
这意味着每个像素值中的三个数字
给出了红,绿和蓝光的数量
将它们混合在一起以获得该像素的颜色。
您可以使用 ImageColorSpace 函数
获取图像的色彩空间
该图像的色彩空间是RGB
图像数据中的数字都在0到1之间
数字越大表示其所代表的光的分量越多
如果应用了Lighter功能使图像更亮
则数字会变大
有几个数字被设置为1
是因为数字限制在从0到1的范围内
因此,如果使图像更亮
会使数字大于1
则数字仅设置为1
表示该颜色的最大数量
这些编号的另一个重要特征
将在本节后面的部分中再次提到
该图像的数据常常以8位即1个字节为单位
存储在计算机中
1个计算机字节由8个0或1表示的位组成
作为二进制数
8个0和1对应于一个从0到255的整数
因此图像数据中数字的
计算机内部表示实际上是从0到255的整数
通过将Automatic作为
ImageData函数的第二个参数
可以看到这种形式
这些整数也是使用
交互式坐标工具
检查单个像素时显示的值
举例来说,点击图片选择坐标工具
在图片上移动光标
显示了这些整数数值
为了方便应用
通常将所有这些整数除以255
以获得从0到1的数字
这是在省略ImageData的
第二个变量时发生的情况
但内部表示仍然是
用字节表示的介于0到255之间的整数
图像数据中使用的数字类型
由ImageType函数给出
该图像的图像类型为Byte
其他图像类型
和使用具体图像类型的某些后果
将在后面的视频中讨论
现在回到对图像的操作
除了使图像更亮以外
当然还有许多其他操作
例如,此输入图像使用 Darker 函数
使图像更暗
这通过减小所有像素值来实现
像Lighter函数一样
Darker 函数可以指定第二个参数
这是一段用于在0和1之间
调整第二个参数的Manipulate代码
0将使图像保持不变
而1将使图像变暗为纯黑色
另一常见的操作是对图像取反
ColorNegate 函数提供该图像的取反
得到的结果是原图的反色图
颜色取反的工作原理是用1(白色)减去每个像素
当然,前提假设是每个像素值中的数字
已归一化为介于0和1之间
比如说,这是一个只包含一个红色像素的图像
该图像的图像数据的单个像素为{1,0,0}
其中1表示最大的红光量
零表示绿色和蓝色的光量
ColorNegate 函数提供该图像的取反
其颜色称为青色,是红色的补色
该图像的图像数据具有单个像素值{0,1,1}
这是从1中减去{1,0,0}像素值的结果
除RGB颜色空间之外,还有许多其他颜色空间
一种常见的色彩空间是灰度色彩空间
用于黑白图像
此输入使用ColorConvert函数
将彩色图像转换为灰度图像
像之前一样放大此灰度图像的部分
并应用ImageData函数显示像素数据
每个像素值现在是一个数字
而不是三个数字组成的列表
在灰度颜色空间中
单个数字以从0到1的比例给出像素的亮度
其中0为黑色,1为白色
其他数字用于不同的灰度
有时,将某些特定的自定义操作
应用于图像中的每个像素值很有用
一种实现方法是使用称为ImageApply的函数
该函数将指定函数应用于
每个像素值
例如,这是一个将其参数乘以2的纯函数
ImageApply 函数将该函数应用于
图像中的每个像素
从而使图像更亮
每个像素值乘以2的情况也是
当将Lighter函数
与第二个参数1一起使用时发生的
里一个可以使用ImageApply轻松实现的
是对图像进行颜色求反
这还是颜色取反示例
如果已将像素值
归一化为介于0和1之间
则通过从1(白色)减去每个像素值
来进行颜色求反
可使用类似的函数从
1中减去像素值
将该函数应用于每个像素值
可得到反色
对颜色的操作还有很多其他可以完成
例如,将彩色图像转换为灰度图像的一种方法
是将均值函数应用于RGB像素值
该函数用单个数字替换
每个RGB像素值中的三个数字
然后单个数字会自动地
被作为一种灰度图片的
一个像素
这与 ColorConvert 函数灰度转换的结果
略微不同
这是之前使用ColorConvert
得到的灰度转换的结果
给出了略微不同的灰度
差别不是很大,但是例如原图像的绿色部分
在灰度图中显示要亮一些
之所以会出现这种差异
是因为ColorConvert函数实际上执行的操作
是给出了红色,绿色和蓝色像素值的
加权平均值
使用加权平均值主要是因为
人眼对某些颜色更敏感
例如,人眼对绿色的敏感度要比对蓝色的敏感度高
因此,在转换为灰度时
绿色的权重要大于蓝色
在结束讨论之前
使本节中的示例具有一定的背景性
本节中所有操作的共同特点是
所有操作
均通过对每个像素分别进行操作而起作用
均通过对每个像素分别进行操作而起作用
像这样的操作称为
逐像素操作或逐点操作
还有许多其他图像操作
一次可操作一个以上像素
这样的被称为邻域操作
其中每个像素的处理会取决于附近的像素值
邻域操作的一个简单示例是
模糊图像(Blurring)
其工作原理是用附近像素颜色的加权平均值替换每个像素
其工作原理是用附近像素颜色的加权平均值替换每个像素
后面的部分将介绍各种邻域操作
这是本节示例的结尾
总结一下
这是本节中的一些词汇
这节介绍了
一些常见的逐点图像处理方法
回顾一些图像处理的基本概念
比如说像素和像素值的数组
RGB色彩空间和灰度色彩空间
下一节继续
学习图像处理中的这些概念
并介绍图像直方图
和其他的逐点操作
翻译:武汉大学 唐安科 2020.7月