图像运算(一)



前言

本文将介绍一些关于图像操作比较基础的运算,主要包括一些加法相关的运算和以及图像的掩膜操作。
其实本人在学习完图像的加法运算后,觉得这部分内容太过无聊单调,但它又是基础,不得不记录一下,好记性不如烂笔头嘛。好在这一部分还有一个图像加权让我感兴趣

图像加权

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 图像加法运算的步骤

  1. 读取图像: 从文件中读取两幅图像。这两幅图像应具有相同的尺寸和通道数。
  2. 逐像素加法: 对于图像中的每个像素位置 ( i , j ) (i,j) (i,j),将图像𝐴和𝐵在该位置的像素值相加,得到结果图像𝐶的像素值。
  3. 处理溢出: 图像的像素值通常在 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 图像加权和运算的步骤

  1. 读取图像: 从文件中读取两幅图像。这两幅图像应具有相同的尺寸和通道数。
  2. 指定权重: 确定每幅图像的权重系数 α 和 β \alpha和\beta αβ
  3. 逐像素加法: 对于图像中的每个像素位置 ( i , j ) (i,j) (i,j),将图像𝐴和𝐵在同一位置的像素值相加,得到结果图像𝐶的像素值。
  4. 处理溢出: 图像的像素值通常在 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+亮度调节量”​。 其中,参数αβsrc1src2所对应的系数,它们的和可以等于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 按位与的用途

  1. 掩膜应用:

    按位与操作常用于应用掩膜(mask),提取图像中的感兴趣区域。掩膜图像是一个二值图像(0和255),在掩膜图像中,255(白色)区域表示需要保留的部分,而0(黑色)区域表示需要忽略的部分。使用按位与操作可以将掩膜应用于原始图像,提取出掩膜中白色区域对应的图像部分。

  2. 图像合成:

    按位与可以将两个图像的交集区域提取出来。只有当两个图像中的像素值都为非零时,结果图像中的相应像素值才为非零。这用于将两个图像中共同的部分合成到一起。

  3. 图像过滤:

    按位与可以用于图像的滤波处理,例如去除噪声或不需要的区域。通过与一个掩膜图像进行按位与操作,可以保留需要的区域,去除不需要的区域。

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 按位或的用途

  1. 图像合成:

    按位或操作可以将两个图像的所有非零部分合并到一起。这用于将图像中的所有可见区域整合到一张图像中。

  2. 图像增强:

    在图像处理和增强中,按位或操作可以用来增强图像的对比度或亮度。例如,将多个图像中的亮度信息合并到一起。

  3. 特征提取:

    通过将多个特征图像合成到一起,按位或操作可以帮助提取图像中的重要特征。例如,合成边缘检测结果和原始图像,显示图像中的边缘信息。

  4. 图像修复:

    按位或操作可以用于修复图像中的缺失部分。例如,将含有修复区域的图像与原始图像合成,恢复图像的完整性。

  5. 遮罩与区域选择:

    可以使用按位或操作将多个掩膜图像合并,选择多个区域。通过合并掩膜图像,可以同时关注多个区域。

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 按位异或的用途

  1. 图像加密与解密:
  • 用途: 按位异或操作常用于简单的图像加密和解密。通过将图像与一个密钥图像进行按位异或运算,可以加密图像。使用相同的密钥图像进行再次按位异或运算,可以解密图像。
  • 示例: 对一张图像进行加密,然后通过与相同的密钥图像进行异或操作来恢复原图像。
  1. 图像去噪:
  • 用途: 按位异或可以用来去除图像中的噪声或错误。通过与一个噪声掩膜进行异或操作,可以识别和去除图像中的噪声部分。
  • 示例: 将图像与一个噪声掩膜进行按位异或,清除噪声。
  1. 图像比较:
  • 用途: 按位异或可以用于比较两张图像的差异。结果图像中的非零区域表示两张图像之间的差异。
  • 示例: 通过对两张图像进行按位异或,显示它们之间的差异区域。
  1. 特征提取:
  • 用途: 按位异或可以用于提取图像的特定特征或变化。通过与不同的掩膜进行异或操作,可以突出显示图像中的特定特征。
  • 示例: 使用按位异或操作提取图像的边缘或其他重要特征。

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 按位非的用途

  1. 图像反转:
  • 用途: 按位非操作常用于图像反转,将图像的亮度值或颜色值进行反转,使得原本明亮的部分变暗,原本暗的部分变亮。
  • 示例: 将灰度图像的每个像素值进行反转,以生成其负片图像。
  1. 掩膜反转:
  • 用途: 在图像处理和计算机视觉中,按位非操作可以用来反转掩膜图像。这样做可以在图像处理中突出显示掩膜图像中未被遮挡的部分。
  • 示例: 将图像掩膜的白色区域变为黑色,黑色区域变为白色,用于反转掩膜的作用。
  1. 图像阈值处理:
  • 用途: 按位非操作可以用于图像的阈值处理,帮助分离前景和背景。
  • 示例: 在二值化处理后,对阈值图像进行反转,以改变前景和背景的定义。
  1. 增强特定特征:
  • 用途: 通过反转图像中的像素值,可以增强或突出显示特定图像特征。
  • 示例: 在处理医学图像时,可能需要反转图像以便更清晰地观察病变区域。

4. 掩膜

4.1 定义

在图像处理中,当我们希望一部分区域被特定处理,而另一部分不被保持原样,那么我们就需要掩膜这种技术了。掩膜(Mask)可以让你选择或控制图像中你所感兴趣区域参与特定处理。掩膜与要被处理的图像具有相同尺寸的矩阵,其矩阵元素值决定了对应图像区域是否被处理。

掩膜通常是一个二值图像或灰度图像,其像素值决定了是否将图像中的对应像素值应用到处理结果中。掩膜可以是以下几种形式:

  • 二值掩膜: 掩膜的像素值为0(黑色)或255(白色),表示图像中对应区域是否被选中。值为255的区域表示处理区域,值为0的区域表示不处理区域。
  • 灰度掩膜: 掩膜的像素值在0到255之间,表示不同的权重或透明度。值越高,表示该区域在处理中的权重越大。

4.2 图像掩膜运算的步骤

  1. 读取图像: 读取需要处理的图像文件。
  2. 创建掩膜: 初始化一个与图像大小相同的掩膜图像,掩膜图像通常是全零的。
  3. 定义掩膜区域: 根据需要处理的区域修改掩膜图像的值。
  4. 应用掩膜: 将掩膜应用到图像中,根据掩膜中设置的区域来处理图像。
  5. 显示或保存结果: 显示处理后的图像或将其保存到文件。

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掩膜()

结果如下:
在这里插入图片描述
如图,中间的图为我们创建的掩膜区域,其中白色部分是我想保留的部分,然后将原图与掩膜进行计算,就得到了我们处理后的图像。


  • 15
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hola173841439

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值