文章目录
前言
本文将介绍一些关于图像操作比较基础的运算,主要包括一些加法相关的运算和以及图像的掩膜操作。
其实本人在学习完图像的加法运算后,觉得这部分内容太过无聊单调,但它又是基础,不得不记录一下,好记性不如烂笔头嘛。好在这一部分还有一个图像加权让我感兴趣
。
1. 图像的加法运算
1.1 定义
图像加法运算指的是将两幅图像的像素值逐一相加,以生成一幅新的图像。在这种运算中,每个像素位置的值都由对应的两个图像的像素值相加得到。设有两幅图像 𝐴和 𝐵(𝐴和 𝐵的尺寸大小必须一模一样
),它们的像素值分别为
A
(
i
,
j
)
和
B
(
i
,
j
)
A(i,j)和B(i,j)
A(i,j)和B(i,j),其中
(
i
,
j
)
(i,j)
(i,j)表示图像种的像素位置。则图像加法运算得到的新图像
𝐶的像素值(以像素值的范围为[0,255]为例)可以表示为:
C
(
i
,
j
)
=
A
(
i
,
j
)
+
B
(
i
,
j
)
(1)
C(i,j)=A(i,j)+B(i,j)\tag{1}
C(i,j)=A(i,j)+B(i,j)(1)
其中需要注意的是,
C
=
m
o
d
(
A
,
B
,
256
)
C=mod(A,B,256)
C=mod(A,B,256)。如果两个图像对应像素值的和小于或等于255,则直接相加得到运算结果。将运算结果对256取模。
1.2 图像加法运算的步骤
- 读取图像: 从文件中读取两幅图像。这两幅图像应具有相同的尺寸和通道数。
- 逐像素加法: 对于图像中的每个像素位置 ( i , j ) (i,j) (i,j),将图像𝐴和𝐵在该位置的像素值相加,得到结果图像𝐶的像素值。
- 处理溢出: 图像的像素值通常在 0 到 255 之间(对于 8 位图像)。如果加法结果超过 255,通常需要进行裁剪处理,以保持像素值在合法范围内。在 OpenCV 中,cv2.add() 函数会自动处理这种溢出。
1.3 opencv加法运算代码
# 这里我们以一个numpy三维数组作为一个彩色图像
import numpy as np
image1=np.random.randint(0,256, size=[3,3,3], dtype=np.uint8)
image2=np.random.randint(0,256, size=[3,3,3], dtype=np.uint8)
print("image1=\n", image1)
print("image2=\n", image2)
print("image1+image2=\n", image1+image2)
2. 图像的加权和运算
2.1 定义
图像的加权和运算是对图像加法运算的一种升级,它允许给两幅图像分别赋予权重,然后进行加法运算。假设有两幅图像𝐴和𝐵,它们的像素值分别为
A
(
i
,
j
)
和
B
(
i
,
j
)
A(i,j)和B(i,j)
A(i,j)和B(i,j)。对于每个像素位置,加权和运算的结果图像𝐶的像素值可以表示为:
C
(
i
,
j
)
=
α
⋅
A
(
i
,
j
)
+
β
⋅
B
(
i
,
j
)
(2)
C(i,j)=\alpha · A(i,j) + \beta · B(i,j) \tag{2}
C(i,j)=α⋅A(i,j)+β⋅B(i,j)(2)
其中 α \alpha α和 β \beta β的和可以等于1,也可以不等于1。
2.2 图像加权和运算的步骤
- 读取图像: 从文件中读取两幅图像。这两幅图像应具有相同的尺寸和通道数。
- 指定权重: 确定每幅图像的权重系数 α 和 β \alpha和\beta α和β。
- 逐像素加法: 对于图像中的每个像素位置 ( i , j ) (i,j) (i,j),将图像𝐴和𝐵在同一位置的像素值相加,得到结果图像𝐶的像素值。
- 处理溢出: 图像的像素值通常在 0 到 255 之间(对于 8 位图像)。如果加法结果超过 255,通常需要进行裁剪处理,以保持像素值在合法范围内。在 OpenCV 中,addWeighted()函数会自动处理这种溢出。
2.3 addWeighted()用法
d s t = c v 2. a d d W e i g h t e d ( s r c 1 , α , s r c 2 , β , γ ) dst=cv2.addWeighted(src1, \alpha, src2, \beta, \gamma) dst=cv2.addWeighted(src1,α,src2,β,γ)
其中,参数 α 和 β 是 s r c 1 和 s r c 2 所对应的系数,它们的和可以等于 1 ,也可以不等于 1 。该函数实现的功能是 d s t = s r c 1 × α + s r c 2 × β + γ 。需要注意,式中参数 γ 的值可以是 0 ,但是该参数是必选参数,不能省略。可以将上式理解为“结果图像 = 图像 1 × 系数 1 + 图像 2 × 系数 2 + 亮度调节量”。 其中,参数\alpha和\beta是src1和src2所对应的系数,它们的和可以等于1,也可以不等于1。该函数实现的功能是dst =src1×\alpha + src2×\beta + \gamma。需要注意,式中参数\gamma的值可以是0,但是该参数是必选参数,不能省略。可以将上式理解为“结果图像=图像1×系数1+图像2×系数2+亮度调节量”。 其中,参数α和β是src1和src2所对应的系数,它们的和可以等于1,也可以不等于1。该函数实现的功能是dst=src1×α+src2×β+γ。需要注意,式中参数γ的值可以是0,但是该参数是必选参数,不能省略。可以将上式理解为“结果图像=图像1×系数1+图像2×系数2+亮度调节量”。
2.4 代码
def 图像加权和():
import cv2
a = cv2.imread("demo.jpg")
b = cv2.imread("641.webp")
if a is None or b is None:
print("One or both images could not be loaded.")
return
print("Image a shape:", a.shape)
print("Image b shape:", b.shape)
if a.shape != b.shape:
print("Resizing image b to match the size of image a.")
b = cv2.resize(b, (a.shape[1], a.shape[0]))
result = cv2.addWeighted(a, 0.7, b, 0.6, 0)
cv2.imshow("hu", a)
cv2.imshow("qianyu", b)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()
图像加权和()
结果如下:
3. 位逻辑运算
图像处理中的位逻辑运算是指对图像进行按位的逻辑运算。位逻辑运算主要包括按位与(AND)、按位或(OR)、按位异或(XOR)、按位非(NOT)等操作操作。它们用于处理图像的像素值,并可用于图像的合成、掩膜应用、图像分割等任务。
3.1 按位与(Bitwise AND) cv2.bitwise_and
3.1.1 按位与的详细解释
按位与操作是对图像中每一个像素的二进制值进行逻辑与操作。对于两个图像的每一个像素位置,将两个图像在该位置的像素值转换为二进制,然后执行逻辑与操作。具体规则如下:
- 逻辑与操作规则:
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
假设我们有两个图像 A 和 B,像素值分别为:
图像 A:像素值 = 10101010(二进制)
图像 B:像素值 = 11001100(二进制)
按位与操作的结果是:
结果: 10001000(二进制)
3.1.2 代码
import cv2
# 读取图像
image1 = cv2.imread("image1.jpg")
image2 = cv2.imread("image2.jpg")
# 进行按位与操作
result = cv2.bitwise_and(image1, image2)
3.1.3 按位与的用途
-
掩膜应用:
按位与操作常用于应用掩膜(mask),提取图像中的感兴趣区域。掩膜图像是一个二值图像(0和255),在掩膜图像中,255(白色)区域表示需要保留的部分,而0(黑色)区域表示需要忽略的部分。使用按位与操作可以将掩膜应用于原始图像,提取出掩膜中白色区域对应的图像部分。
-
图像合成:
按位与可以将两个图像的交集区域提取出来。只有当两个图像中的像素值都为非零时,结果图像中的相应像素值才为非零。这用于将两个图像中共同的部分合成到一起。
-
图像过滤:
按位与可以用于图像的滤波处理,例如去除噪声或不需要的区域。通过与一个掩膜图像进行按位与操作,可以保留需要的区域,去除不需要的区域。
3.2 按位或(Bitwise OR) cv2.bitwise_or
按位或(Bitwise OR) 是图像处理中的一种位运算操作,用于将两个图像的每个像素位置的二进制值进行逻辑或运算。这个操作会将两个图像中对应位置的像素值进行按位比较,只要任意一个像素值为1,结果像素值就是1。否则,结果像素值就是0。
3.2.1 按位或的详细解释
按位或(Bitwise OR) 是图像处理中的一种位运算操作,用于将两个图像的每个像素位置的二进制值进行逻辑或运算。这个操作会将两个图像中对应位置的像素值进行按位比较,只要任意一个像素值为1,结果像素值就是1。否则,结果像素值就是0。具体规则如下:
- 逻辑或操作规则:
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
假设我们有两个图像 A 和 B,像素值分别为:
图像 A:像素值 = 10101010(二进制)
图像 B:像素值 = 11001100(二进制)
按位或操作的结果是:
结果: 11101110(二进制)
3.2.2 代码
import cv2
# 读取图像
image1 = cv2.imread("image1.jpg")
image2 = cv2.imread("image2.jpg")
# 进行按位或操作
result = cv2.bitwise_or(image1, image2)
3.2.3 按位或的用途
-
图像合成:
按位或操作可以将两个图像的所有非零部分合并到一起。这用于将图像中的所有可见区域整合到一张图像中。
-
图像增强:
在图像处理和增强中,按位或操作可以用来增强图像的对比度或亮度。例如,将多个图像中的亮度信息合并到一起。
-
特征提取:
通过将多个特征图像合成到一起,按位或操作可以帮助提取图像中的重要特征。例如,合成边缘检测结果和原始图像,显示图像中的边缘信息。
-
图像修复:
按位或操作可以用于修复图像中的缺失部分。例如,将含有修复区域的图像与原始图像合成,恢复图像的完整性。
-
遮罩与区域选择:
可以使用按位或操作将多个掩膜图像合并,选择多个区域。通过合并掩膜图像,可以同时关注多个区域。
3.3 按位异或(Bitwise XOR) cv2.bitwise_xor
3.3.1 按位异或的详细解释
按位异或(XOR) 操作是在两个二进制数的每一位上进行逻辑异或运算。按位异或的运算规则如下:
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
假设我们有两个图像 A 和 B,像素值分别为:
图像 A:像素值 = 10101010(二进制)
图像 B:像素值 = 11001100(二进制)
按位或操作的结果是:
结果: 01100110(二进制)
在图像处理中,按位异或操作会对图像中每个像素的二进制值进行逐位异或运算。结果图像中只有在两个图像的对应像素值不同的地方,才会有非零值。
3.3.2 代码
import cv2
# 读取图像
image1 = cv2.imread("image1.jpg")
image2 = cv2.imread("image2.jpg")
# 进行按位异或操作
result = cv2.bitwise_xor(image1, image2)
3.3.3 按位异或的用途
- 图像加密与解密:
- 用途: 按位异或操作常用于简单的图像加密和解密。通过将图像与一个密钥图像进行按位异或运算,可以加密图像。使用相同的密钥图像进行再次按位异或运算,可以解密图像。
- 示例: 对一张图像进行加密,然后通过与相同的密钥图像进行异或操作来恢复原图像。
- 图像去噪:
- 用途: 按位异或可以用来去除图像中的噪声或错误。通过与一个噪声掩膜进行异或操作,可以识别和去除图像中的噪声部分。
- 示例: 将图像与一个噪声掩膜进行按位异或,清除噪声。
- 图像比较:
- 用途: 按位异或可以用于比较两张图像的差异。结果图像中的非零区域表示两张图像之间的差异。
- 示例: 通过对两张图像进行按位异或,显示它们之间的差异区域。
- 特征提取:
- 用途: 按位异或可以用于提取图像的特定特征或变化。通过与不同的掩膜进行异或操作,可以突出显示图像中的特定特征。
- 示例: 使用按位异或操作提取图像的边缘或其他重要特征。
3.4 按位非(Bitwise NOT) cv2.bitwise_not
3.4.1 按位非的详细解释
按位非(NOT) 操作是对二进制数的每一位进行取反运算。按位非的运算规则如下:
0 变为 1
1 变为 0
3.4.2 代码
import cv2
# 读取图像
image = cv2.imread("image.jpg")
# 进行按位非操作
result = cv2.bitwise_not(image)
3.4.3 按位非的用途
- 图像反转:
- 用途: 按位非操作常用于图像反转,将图像的亮度值或颜色值进行反转,使得原本明亮的部分变暗,原本暗的部分变亮。
- 示例: 将灰度图像的每个像素值进行反转,以生成其负片图像。
- 掩膜反转:
- 用途: 在图像处理和计算机视觉中,按位非操作可以用来反转掩膜图像。这样做可以在图像处理中突出显示掩膜图像中未被遮挡的部分。
- 示例: 将图像掩膜的白色区域变为黑色,黑色区域变为白色,用于反转掩膜的作用。
- 图像阈值处理:
- 用途: 按位非操作可以用于图像的阈值处理,帮助分离前景和背景。
- 示例: 在二值化处理后,对阈值图像进行反转,以改变前景和背景的定义。
- 增强特定特征:
- 用途: 通过反转图像中的像素值,可以增强或突出显示特定图像特征。
- 示例: 在处理医学图像时,可能需要反转图像以便更清晰地观察病变区域。
4. 掩膜
4.1 定义
在图像处理中,当我们希望一部分区域被特定处理,而另一部分不被保持原样,那么我们就需要掩膜这种技术了。掩膜(Mask)可以让你选择或控制图像中你所感兴趣区域参与特定处理。掩膜与要被处理的图像具有相同尺寸的矩阵,其矩阵元素值决定了对应图像区域是否被处理。
掩膜通常是一个二值图像或灰度图像,其像素值决定了是否将图像中的对应像素值应用到处理结果中。掩膜可以是以下几种形式:
- 二值掩膜: 掩膜的像素值为0(黑色)或255(白色),表示图像中对应区域是否被选中。值为255的区域表示处理区域,值为0的区域表示不处理区域。
- 灰度掩膜: 掩膜的像素值在0到255之间,表示不同的权重或透明度。值越高,表示该区域在处理中的权重越大。
4.2 图像掩膜运算的步骤
- 读取图像: 读取需要处理的图像文件。
- 创建掩膜: 初始化一个与图像大小相同的掩膜图像,掩膜图像通常是全零的。
- 定义掩膜区域: 根据需要处理的区域修改掩膜图像的值。
- 应用掩膜: 将掩膜应用到图像中,根据掩膜中设置的区域来处理图像。
- 显示或保存结果: 显示处理后的图像或将其保存到文件。
4.3 代码
def BRG_OPENCV掩膜():
import cv2
import numpy as np
a = cv2.imread("641.webp", 1)
b = np.zeros(a.shape, dtype=np.uint8) # 创建掩膜
print(b.shape)
定义掩膜区域
b[100:400, 200:400] = 255
c = cv2.bitwise_and(a, b)
print("a.shape=", a.shape)
print("b.shape=", b.shape)
cv2.imshow("yuantu", a)
cv2.imshow("yanmo", b)
cv2.imshow("yanmohou", c)
cv2.waitKey()
cv2.destroyAllWindows()
BRG_OPENCV掩膜()
结果如下:
如图,中间的图为我们创建的掩膜区域,其中白色部分是我想保留的部分,然后将原图与掩膜进行计算,就得到了我们处理后的图像。