第四章:数字图像基本运算

算数运算

算数运算概述

定义:对两幅输入的图像进行点对点的加、减、乘、除计算得到的输出图像,数学表达式为:

  • 加法运算:输出图像 C 的像素值 C(x,y)=A(x,y)+B(x,y)
  • 减法运算:输出图像 C 的像素值 C(x,y)=A(x,y)-B(x,y)
  • 乘法运算:输出图像 C 的像素值 C(x,y)=A(x,y)×B(x,y)
  • 除法运算:输出图像 C 的像素值 C(x,y)=A(x,y)/B(x,y)(需注意分母不能为 0)

对整幅图的算术运算是逐像素进行的。算术运算每次只涉及1个空间像素的位

图像算数运算中,最为重要的是乘法运算,也就是点运算

算数运算的应用场景

加法运算应用---均值降噪

对于同一场景的多幅图像求平均值,以降低叠加性随机噪声

对于原图像\(F(x,y)\),有一个噪音图像集 \(G_i(x,y)\),其中 \(i = 1,2,\cdots,M\)

\(G_i(x,y)=F(x,y)+H_i(x,y)\)

\(M\)个图像的均值定义为:\(G(x,y)=\frac{G_0(x,y)+G_1(x,y)+\cdots+G_M(x,y)}{M}\)

当噪音 \(H_i(x,y)\) 为互不相关,且均值为0时,上述图象均值将降低噪音的影响。

均值降噪在摄影中的应用:如果想要拍摄静止的建筑,但是周围很多游客等移动的物体,可以多拍几张利用均值降噪去除运动的物体,保留静止的部分

加法运算应用---二次曝光

概念:将一幅图像内容加到另一幅图像上,实现二次曝光

对于两个图像\(A(x,y)\)\(B(x,y)\)的均值有:

\(C(x,y)=\frac{A(x,y)}{2}+\frac{B(x,y)}{2}\)

会得到二次曝光的效果

推广这个公式为:\(C(x,y)=\alpha A(x,y)+(1-\alpha)B(x,y)\),我们可以得到各种图像合成的效果

如果两张一样的图像进行二次曝光,可以处理较暗的图像,增加曝光,提亮暗部

控制好 \(\alpha\) 还可以改变透明度 ,实现两张图片的合成效果

图片1 图片2 处理结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 加法运算应用——二次曝光
from PIL import Image

# 打开两张图片
image1 = Image.open('图片3(1).png')
image2 = Image.open('图片4.png')

# 确保两张图片尺寸相同
if image1.size!= image2.size:
raise ValueError("两张图片尺寸不同,无法进行逐像素相减。")

# 创建一个新的图像用于存储结果
result_image = Image.new('RGB', image1.size)

# 逐像素相减
for x in range(image1.width):
for y in range(image1.height):
pixel1 = image1.getpixel((x, y))
pixel2 = image2.getpixel((x, y))
new_pixel = tuple(min(255, int(a/2 + b/2)) for a, b in zip(pixel2, pixel1))
result_image.putpixel((x, y), new_pixel)

# 保存结果图片
result_image.save('二次曝光结果.png')

减法运算应用---减去背景

减法运算常用于去除不需要的叠加性图案

设:背景图像\(B(x,y)\),前景背景混合图像\(A(x,y)\)

\({C(x,y)=A(x,y)-B(x,y)}\)\({C(x,y)}\)为去除了背景的图像。

混合图像 背景图像 处理结果

和老师给的效果不一样,可能是代码的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 减法运算应用——减去背景
from PIL import Image

# 打开两张图片
image1 = Image.open('图片1.png')
image2 = Image.open('图片2.png')

# 确保两张图片尺寸相同
if image1.size!= image2.size:
raise ValueError("两张图片尺寸不同,无法进行逐像素相减。")

# 创建一个新的图像用于存储结果
result_image = Image.new('RGB', image1.size)

# 逐像素相减
for x in range(image1.width):
for y in range(image1.height):
pixel1 = image1.getpixel((x, y))
pixel2 = image2.getpixel((x, y))
new_pixel = tuple(max(0, abs(a - b)) for a, b in zip(pixel2, pixel1))
result_image.putpixel((x, y), new_pixel)

# 保存结果图片
result_image.save('减去背景结果.png')

减法运算应用---运动检测

如果有同一地区时间稍有差异的两张图像,那么就能够利用图像相减的方法,来获得运动物体的图像,即差图像

减法运算应用---梯度幅度

图像的减法运算可用于得到图像梯度幅度,梯度幅度表示图像每点斜率的大小

梯度幅度的计算公式:

对于离散数字图像,梯度幅度的近似计算公式:

梯度幅度在物体的边缘处很高,在均匀的内部梯度幅度很低,梯度图像常用来做轮廓特征的提取

乘法运算应用---二值蒙板

用二值蒙板图像与原图像做乘法可实现图像的局部显示(遮掉图像的某些部分)

在需要被完整保留下来的区域,掩模图像的值为1,而在需要被遮掉的区域,掩模图像的值为0。原图像乘上掩模图像,可抹去图像的某些部分,使该部分为0。

注意:在实际编程中,为保证图像亮度在有效范围内,两幅图像对应位置处的像素的R、G、B三分量相乘之后,还需要除以亮度的最大值255。

灰度蒙板会比二值蒙板效果更好一点,一般会使用灰度蒙板!!!

二值蒙板 原图 处理结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 乘法运算应用——二值蒙板
from PIL import Image
import numpy as np

# 打开两张图片
image1 = Image.open('图片7.png')
image2 = Image.open('图片8.png')

# 创建一个新的图像用于存储结果
result_image = Image.new('RGB', image1.size)

# 逐像素相减
for x in range(image1.width):
for y in range(image1.height):
pixel1 = image1.getpixel((x, y))
pixel2 = image2.getpixel((x, y))
new_pixel = tuple(int(a * b /255) for a, b in zip(pixel1, pixel2))
result_image.putpixel((x, y), new_pixel)

# 保存结果图片
result_image.save('二值蒙板.png')

乘法运算应用---“正片叠底”与“滤色”

正片叠底: \[[A(x, y) * B(x, y)]/255\]

模拟反光体的颜色混合(相减混色),如打印机的油墨。

滤色:\[255-{[255-A(x, y)] * [255-B(x, y)]}/255\]

模拟发光体的颜色混合(相加混色),如显示器的光束。

1
2
3
4
5
def multiply_blend(pixel1, pixel2):
return tuple(int((a * b) / 255) for a, b in zip(pixel1, pixel2))

def screen_blend(pixel1, pixel2):
return tuple(255 - int(((255 - a) * (255 - b)) / 255) for a, b in zip(pixel1, pixel2))

正片叠底可以起到图像增强的效果,如前面提到的二次曝光后的图片,不是很清晰,可以两张一样的图片利用正片叠底来增强

原图 正片叠底一次 正片叠底两次 正片叠底三次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 乘法运算应用——“正片叠底”
from PIL import Image
import numpy as np

def multiply_blend(pixel1, pixel2):
return tuple(int((a * b) / 255) for a, b in zip(pixel1, pixel2))

# 打开两张图片
image1 = Image.open('图片9.png')
image2 = Image.open('图片9.png')

# 创建新图像用于存储正片叠底结果
multiply_result_image = Image.new('RGB', image1.size)

# 正片叠底
for x in range(image1.width):
for y in range(image1.height):
pixel1 = image1.getpixel((x, y))
pixel2 = image2.getpixel((x, y))
multiply_result_image.putpixel((x, y), multiply_blend(pixel1, pixel2))

# 保存结果图片
multiply_result_image.save('图片11.png')

正片叠底的基本原理与视觉效果

  • 基于像素值乘法与归一化:对于图像中每个对应位置的像素,正片叠底操作会将上层图像像素的 RGB 通道值与下层图像对应像素的 RGB 通道值分别相乘,然后将结果除以 255(针对 8 位图像深度,即 RGB 值范围为 0 - 255)
  • 整体变暗效果:因为像素值相乘会使整体数值变小(除非像素值本身为 255),所以正片叠底通常会使图像整体变暗,就好像透过有色玻璃观察图像一样,颜色变得更深沉浓郁。例如,白色(255, 255, 255)与任何颜色进行正片叠底运算,结果都是该颜色本身;而黑色(0, 0, 0)与任何颜色正片叠底都会得到黑色,这使得图像中的暗部区域在正片叠底后变得更暗

正片叠底的色彩混合表现

  • 印刷与绘画领域:模拟油墨混合效果,当多种颜色油墨叠印时,由于油墨吸收光线而非反射光线,正片叠底模式符合这种物理特性,使颜色混合后变深变暗,例如黄色(255, 255, 0)与青色(0, 255, 255)正片叠底后得到绿色(0, 255, 0),且颜色比原来两种颜色都要暗
  • 数字图像处理软件:常用于合成图像时,使添加的元素与背景自然融合,比如将一个带有半透明阴影的物体合成到背景图像上,使用正片叠底模式可让阴影看起来更真实,就像光线被物体遮挡后投射在背景上一样,增强了图像的层次感和立体感

滤色模式

  • 是一种相加混色模式,与正片叠底的相减混色相反,它会使图像变亮,常用于模拟发光效果或增强图像中的亮部区域。例如,在处理夜景照片时,正片叠底可能用于加深天空等背景部分以突出前景灯光,而滤色模式则可用于增强灯光本身的亮度和光晕效果
原图 滤色一次 滤色二次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 乘法运算应用——“滤色”
from PIL import Image
import numpy as np

def screen_blend(pixel1, pixel2):
return tuple(255 - int(((255 - a) * (255 - b)) / 255) for a, b in zip(pixel1, pixel2))

# 打开两张图片
image1 = Image.open('图片1.png')
image2 = Image.open('图片1.png')

# 创建新图像用于存储滤色结果
screen_result_image = Image.new('RGB', image1.size)

# 滤色
for x in range(image1.width):
for y in range(image1.height):
pixel1 = image1.getpixel((x, y))
pixel2 = image2.getpixel((x, y))
screen_result_image.putpixel((x, y), screen_blend(pixel1, pixel2))

# 保存结果图片
screen_result_image.save('图片13.png')

除法运算应用

略...

逻辑运算

逻辑运算概述

两幅输入图象进行点对点的与、或、异或计算而得到输出图象,对整幅图的逻辑运算是逐像素进行的,数学表达式如下:

求反运算

求反运算的参数255与具体图像的通道数有关,不一定是255

求反运算的功能:

  • 获得彩色图像的阴图像(色调与灰度相反)
  • 获得二值图像的补图像

与运算

与运算常用于二值图像,求解两幅图像的相交子集,如下例:

或运算

通常只用于二值图像,用来合并子图像

异或运算

异或运算(像素值相同取0,不同取1)定义:

几何运算

几何运算可以改变图像中各对象之间的空间关系,可以看成将各个物体在图像内运动

几何运算需要两个独立的算法, - 首先需要一个算法来定义空间变换本身,用它来描述每个像素点如何从初始位置移动到终止位置 - 同时还需要一个灰度级的插值算法,很多时候输入图像和输出图像的像素点之间不是一一对应的关系(放大)

几何运算的数学描述:

几何运算中涉及到的两种映射方式

向前映射法(像素移交)

- 从输入图像坐标计算出输出图像坐标。 - 平移、镜像、转置采用这种方法。

向后映射法(像素填充)

- 从输出图像坐标计算出输入图像坐标。 - 缩放、旋转、拉伸采用这种方法。

1、平移

输入像素与输出像素存在一一对应的关系,不需要插值计算

计算方法

矩阵表示如下

2、镜像变换

水平镜像计算公式:

垂直镜像计算公式:

注意水平镜像只需要变一半的像素即可!

矩阵表示如下:

输入像素与输出像素存在一一对应的关系,不需要插值计算

实例:

3、图像转置

转置就是将图像像素的x坐标和y坐标互换,转置操作会改变图像的大小(因为涉及到了行对齐),所以需要重新分配内存给新的图像

矩阵表示如下:

输入像素与输出像素存在一一对应的关系,不需要插值计算

4、缩放

缩放操作将改变图像大小,产生的图像中的像素可能在原图像中找不到相应的像素点。因此需要进行插值计算

矩阵表示:

逆运算为:

5、旋转

改变图像大小,旋转产生的图像中的像素可能在原图像中找不到相应的像素点。需要进行插值计算

这里需要注意旋转操作的公式计算以及矩阵表达式

同时旋转需要重新计算图片的宽高,用下面的方法:

TODO:这里其实有个疑问,就是按照公式来理解,旋转后新的图框应该是外切原图的,但是老师上课演示的程序好像不是这样,所以后面要自己代码实现一遍,看看是哪里的问题

下面的公式是为了找到原像素点与旋转后像素点之间的对应关系,注意不是一一对应!

6、拉伸

没有...

7、插值算法

课上只介绍了两种常见插值算法

(1)最邻近插值(0阶插值)

令输出图像的灰度值等于离它所映射到的位置最近的输入像素的灰度值

(2)双线性插值(1阶插值)期末考试必考内容

原理图如下,其实就是空间线性变换,计算时小心点就行,比较好理解

最后总的表达式:

(3)高阶插值

常见高阶插值的例子有:三次样条、Legendre中心函数和sin(ax)/ax函数,略过...

灰度直方图

灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数

其中,横坐标表示的是灰度级,纵坐标表示的是该灰度级出现的频率(像素的个数或者像素个数与总数之比)

灰度直方图是图像的重要特征,反映了图像的灰度分布情况

原图像 灰度直方图

对于彩色图像来说,可以利用三个通道的分通道直方图来表示对应颜色的像素级分布情况

灰度直方图的计算方法

Step1 初始化:H[k] = 0; k = 0, … ,L-1

Step2 统计: H [f(x, y)] ++; x = 0, … ,M-1, y = 0, … ,N-1

Step3 归一化:H [f(x, y)] /= M×N (归一化后的直方图为图像的概率密度函数PDF)

灰度直方图的性质

① 不表示图像的空间信息

直方图描述了每个灰度级具有的像素的个数,但不能为这些像素在图像中的位置提供任何线索。

② 任一特定图像都有唯一直方图,但反之并不成立

例如,在图像中移动物体对直方图没有影响。

③直方图的可相加性

如果一图像由两个不连接的区域组成,并且每个区域的直方图已知,则整幅图像的直方图是该两个区域的直方图之和。

灰度直方图的用途

用途① - 可以用来判断灰度直方图的量化是否恰当---高质量的图像可以实现全部或几乎全部的灰度级利用

用途② - 用来判断图像影调的明暗以及曝光效果

用途③ - 判断图像对比度

用途④ - 边界阈值选择

假设图像的背景是浅色,物体是深色,对应的灰度直方图是双峰形状,选择谷作为灰度阈值可以实现物体的边界分割

点运算

什么是点运算?

  • 对于一幅输入的图像,产生一幅输出图像,输出图像的每个像素点的灰度值由输入像素点决定,可以理解为点运算就是改变一幅图像的灰度直方图

点运算完全由灰度变换函数 gray-scale transformation, GST)来确定,是一个输入灰度级和输出灰度级之间的映射关系

点运算特点

又称为对比度增强,对比度拉伸或曲线变换。是数字图像处理软件的重要组成部分

特点:

  • 输入像素和输出像素一一对应
  • 不改变图像的空间关系(非几何运算)

线性点运算案例分析

DA为输入点的灰度值,DB为相应输出点的灰度值

  • 若a = 1, b = 0,图像灰度值不发生任何变化;
  • 若a = 1, b ≠ 0,图像灰度值上移或下移,即图像整体变亮或变暗;
  • 若a > 1,变亮,图像对比度增强;
  • 若 0 < a < 1,变暗,图像对比度减弱;
  • 若 a < 0,暗区域变亮,亮区域变暗。
  • 若a = -1, b = 255,反色

非线性点运算案例分析 GST

其中, DA为输入点的灰度值,DB为相应输出点的灰度值,Dm为灰度级的最大值,参数C定义了中间灰度范围内的增加(C > 0)或减少(C < 0)的程度

直方图均衡化

目的:

  • 使一输入图象转换为在每一灰度级上都有相同的像素点数(即输出的直方图是平的)

功效:

  • 自动地增加像素灰度的分布范围,达到增强整个图像对比度的效果

应用:

  • 广泛应用在图像增强处理中。
    • ①提高图像的主观质量,在处理艺术图像时非常有用;
    • ②经过直方图均衡化的图像对二值化阈值选取十分有利;
    • ③有利于进行基于直方图的图像匹配

可以使用 累计分布函数 作为 直方图 变换为 均匀分布 的转换函数

累计分布函数的计算公式为:

DA为输入点的灰度值,DB为相应输出点的灰度值,Dm为灰度级的最大值(通常即255),A0为图像面积,H(k)为输入图像灰度直方图

直方图均衡化的计算

这部分内容是期末考试必考内容,10分左右,一定要会计算


第四章:数字图像基本运算
http://jrhu0048.github.io/2024/10/21/shu-zi-tu-xiang-chu-li/di-si-zhang-shu-zi-tu-xiang-ji-ben-yun-suan/
作者
JR.HU
发布于
2024年10月21日
更新于
2024年12月28日
许可协议