(数字图像处理MATLAB+Python)第三章图像基本运算-第二节:图像代数运算

文章目录

  • 一:图像算数运算
    • (1)加法运算
      • A:概述
      • B:程序
    • (2)减法运算
      • A:概述
      • B:程序
    • (3)乘法运算
      • A:概述
      • B:程序
    • (4)除法运算
      • A:概述
      • B:程序
  • 二:图像逻辑运算
    • (1)概述
    • (2)程序

一:图像算数运算

(1)加法运算

A:概述

加法运算:指将两幅同大小的图像进行像素级别的加法操作,得到一幅新的图像。设两幅图像对应的像素值分别为 f 1 ( x , y ) f_{1}(x,y) f1(x,y) f 2 ( x , y ) f_{2}(x,y) f2(x,y),则它们的加法运算可表示为

g ( x , y ) = f 1 ( x , y ) + f 2 ( x , y ) g(x,y)=f_{1}(x,y) + f_{2}(x,y) g(x,y)=f1(x,y)+f2(x,y)

进行图像加法运算时,处理和值的方式主要有以下几种

  • 截断处理:当两幅图像的对应像素值相加结果超出图像灰度级的最大值时,将结果强制截断为最大灰度级,例如在8位灰度图像中,最大值为255
  • 加权求和:不同位置的像素值不仅仅是简单地相加,还需要根据不同位置的权重进行加权,以便更好地满足具体的应用需求
  • 缩放处理:将两幅图像的对应像素值相加结果缩放到指定的灰度级范围内,例如在8位灰度图像中,将结果除以一个因子,使其不超过255
  • 溢出处理:当两幅图像的对应像素值相加结果超出图像灰度级的最大值时,将结果自动溢出到下一级别,例如在8位灰度图像中,溢出到9级时,像素值为0,溢出到10级时,像素值为1,以此类推
  • 饱和度处理:当两幅图像的对应像素值相加结果超出图像灰度级的最大值时,将结果设定为最大值。这种处理方式也被称为上溢出处理,而下溢出处理则将结果设定为0

(数字图像处理MATLAB+Python)第三章图像基本运算-第二节:图像代数运算_第1张图片

图像加法运算主要应用如下

  • 图像增强:通过将一幅图像与一幅较亮或较暗的图像相加,可以增强图像的对比度和亮度,使其更加清晰明亮
  • 图像融合:将两幅不同角度或不同波段的图像进行加权和处理,可以得到一幅融合后的图像,用于提高图像的质量和信息量
  • 目标检测:将不同尺度或不同方向的图像进行加权和处理,可以得到一幅新的图像,用于检测目标的位置和形状
  • 噪声去除:通过将一幅图像与一幅平滑或模糊的图像相加,可以抑制图像中的噪声,提高图像的信噪比
  • 彩色图像生成:将不同波段的灰度图像进行加权和处理,可以得到一幅新的彩色图像,用于彩色图像的生成和处理

B:程序

MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册

imadd(X,Y)函数:是MATLAB中用于执行图像加法运算的函数

  • AB是两幅需要相加的图像,它们可以是灰度图像、RGB图像或二值图像
  • 除此之外,imadd()函数还可以通过添加一些可选参数来控制图像加法运算的处理方式。以下是其中一些常用的可选参数
    • scaling:用于控制图像加法运算的缩放方式,可选值有uint8uint16singledouble。默认值为uint8
    • outputtype:用于指定输出图像的数据类型,可选值包括与输入图像类型相同的类型,默认值与输入图像类型相同
    • fillvalues:用于指定当相加结果超出图像灰度级范围时,如何填充超出范围的像素值
      • bound:截断处理(默认)
      • nearest:最近邻差值
      • samesize:将超出范围的像素值设为输入图像的最大值
    • uint16:用于将输出图像的数据类型指定为16位无符号整型,可用于处理高动态范围图像

实现如下效果

(数字图像处理MATLAB+Python)第三章图像基本运算-第二节:图像代数运算_第2张图片

Back = imread('desert.jpg');
Foreground = imread('car.jpg');

result1 = imadd(Foreground,-100);
result2 = imadd(Back, Foreground);
result3 = imadd(Back, result1);

subplot(221),imshow(Foreground),title('原目标图');
subplot(222),imshow(result1),title('原目标图加标量');
subplot(223),imshow(result2),title('原目标图加背景');
subplot(224),imshow(result3),title('加标量图叠加背景');

Python实现:使用Python实现上述同样的功能

cv2.add(src1, src2[, dst[, mask[, dtype]]])函数:该函数将每个像素的值相加,并将结果存储在输出图像中。如果相加的结果大于输出图像的数据类型所能表示的最大值,则该像素的值将被截断,并存储为最大值。如果输出图像的数据类型为无符号整数类型,则任何小于0的像素值都会被截断为0。如果输出图像的数据类型为有符号整数类型,则任何大于最大值的像素值都会被截断为最大值

  • src1:第一个输入图像。
  • src2:第二个输入图像。
  • dst:输出图像,它的大小和类型与输入图像相同,或者可以为None
  • mask:一个可选的掩膜图像,它必须与输入图像具有相同的尺寸,或者可以为None
  • dtype:输出图像的数据类型,如果没有指定,则默认为src1.dtype
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']

Back = cv2.imread('desert.jpg')
Foreground = cv2.imread('car.jpg')

result1 = cv2.add(Foreground, -100)
result2 = cv2.add(Back, Foreground)
result3 = cv2.add(Back, result1)

plt.subplot(221), plt.imshow(cv2.cvtColor(Foreground, cv2.COLOR_BGR2RGB)), plt.title('原目标图')
plt.subplot(222), plt.imshow(cv2.cvtColor(result1, cv2.COLOR_BGR2RGB)), plt.title('原目标图加标量')
plt.subplot(223), plt.imshow(cv2.cvtColor(result2, cv2.COLOR_BGR2RGB)), plt.title('原目标图加背景')
plt.subplot(224), plt.imshow(cv2.cvtColor(result3, cv2.COLOR_BGR2RGB)), plt.title('加标量图叠加背景')
plt.show()

(数字图像处理MATLAB+Python)第三章图像基本运算-第二节:图像代数运算_第3张图片

(2)减法运算

A:概述

减法运算:指将两幅同大小的图像进行像素级别的加法操作,得到一幅新的图像。设两幅图像对应的像素值分别为 f 1 ( x , y ) f_{1}(x,y) f1(x,y) f 2 ( x , y ) f_{2}(x,y) f2(x,y),则它们的减法运算可表示为

g ( x , y ) = f 1 ( x , y ) − f 2 ( x , y ) g(x,y)=f_{1}(x,y) - f_{2}(x,y) g(x,y)=f1(x,y)f2(x,y)

进行图像加法运算时,处理和值的方式主要有以下几种

  • 截断处理:将两幅图像对应像素点的灰度值相减后,如果差值超过了一定的阈值,就将其截断为该阈值,否则保留原值作为差值结果
  • 取绝对值:将两幅图像对应像素点的灰度值相减,再取绝对值作为两幅图像差值的结果。该方法简单易实现,但容易受到图像亮度和对比度的影响,对灰度变化较大的图像效果不佳
  • 平方差值:将两幅图像对应像素点的灰度值相减后取平方,再将所有差值求和并开方,作为两幅图像差值的结果。该方法能够有效地消除灰度变化对结果的影响,但会放大灰度变化较大的区域,从而影响差值的准确性
  • 加权平方差值:为了平衡两种方法的缺点,可以使用加权平方差值法,即将每个像素点的差值乘以一个权重系数后再求和并开方。常用的权重系数包括高斯函数、均匀分布函数等,能够有效地消除灰度变化对结果的影响,同时避免了平方差值法放大灰度变化较大的区域的缺点

(数字图像处理MATLAB+Python)第三章图像基本运算-第二节:图像代数运算_第4张图片

图像减法运算主要应用如下

  • 目标检测:将背景图像与包含目标的图像相减,得到只有目标区域的差异图像,可以通过差异图像进行目标检测和识别
  • 图像增强:将图像的低频分量与高频分量分离,去除低频分量得到的高频图像与原图像相减,可以增强图像的边缘和细节
  • 背景消除:在视频处理中,通过将当前帧图像与前一帧图像相减,得到差异图像,可以用于背景消除和移动物体的跟踪
  • 纹理分析:在纹理分析中,将一幅图像与其经过旋转或缩放等变换后的图像相减,可以得到只包含纹理信息的图像,用于纹理分类和分析
  • 形态学处理:在形态学处理中,将图像进行二值化处理后,将原图像与腐蚀、膨胀等形态学操作的结果图像相减,可以得到形态学处理后的图像

B:程序

MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册

imsubtract函数:是MATLAB中用于计算两幅图像之间像素值差异的函数。它可以用来减去一个图像中的像素值,以及两幅图像中对应像素之间的差异

  • 输入参数I1I2表示需要计算差异的两幅图像,它们可以是灰度图像或彩色图像。输出参数J是计算得到的结果图像,它的大小和类型与输入图像相同
  • 可选参数'uint8''intensity'用于指定输出结果的数据类型,可以是uint8double类型。如果省略这个参数,imsubtract函数会默认使用与输入图像相同的数据类型
J = imsubtract(I1, I2);
J = imsubtract(I1, I2, 'uint8');
J = imsubtract(I1, I2, 'intensity');

imabsdiff函数:是MATLAB中用于计算两幅图像之间像素值绝对差异的函数。它可以用来计算两幅图像中对应像素之间的绝对差异。该函数没有可选参数


实现如下效果
(数字图像处理MATLAB+Python)第三章图像基本运算-第二节:图像代数运算_第5张图片

Back=imread('hallback.bmp');
Foreground=imread('hallforeground.bmp');
result = imabsdiff(Foreground,Back);
subplot(131),imshow(Back),title('背景');
subplot(132),imshow(Foreground),title('前景图');
subplot(133),imshow(result),title('图像相减');

Python实现:使用Python实现上述同样的功能

cv2.absdiff(src1, src2[, dst])函数:是OpenCV中用于计算两个图像差异的函数

  • src1:第一个输入图像,可以是单通道或多通道图像,数据类型为numpy数组
  • src2:第二个输入图像,与src1有相同的尺寸和数据类型,可以是单通道或多通道图像,数据类型为numpy数组
  • dst:可选参数,输出图像,与输入图像有相同的尺寸和数据类型,数据类型为numpy数组。如果没有指定,则会创建一个与src1src2有相同尺寸和数据类型的数组作为输出
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']

# 读取背景和前景图像
Back = cv2.imread('hallback.bmp')
Foreground = cv2.imread('hallforeground.bmp')

# 计算前景图像和背景图像的像素绝对差值
result = cv2.absdiff(Foreground, Back)

# 使用matplotlib展示结果图像
plt.subplot(1, 3, 1)
plt.imshow(cv2.cvtColor(Back, cv2.COLOR_BGR2RGB))
plt.title('背景')

plt.subplot(1, 3, 2)
plt.imshow(cv2.cvtColor(Foreground, cv2.COLOR_BGR2RGB))
plt.title('前景图')

plt.subplot(1, 3, 3)
plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
plt.title('图像相减')

plt.show()

(数字图像处理MATLAB+Python)第三章图像基本运算-第二节:图像代数运算_第6张图片

(3)乘法运算

A:概述

加法运算:是一种逐像素进行的二元运算。它将两个输入图像中对应像素的像素值相乘,得到一个新的输出图像。设两幅图像对应的像素值分别为 f 1 ( x , y ) f_{1}(x,y) f1(x,y) f 2 ( x , y ) f_{2}(x,y) f2(x,y),则它们的乘法运算可表示为

g ( x , y ) = f 1 ( x , y ) × f 2 ( x , y ) g(x,y)=f_{1}(x,y) × f_{2}(x,y) g(x,y)=f1(x,y)×f2(x,y)

图像乘法运算主要应用如下

  • 图像增强:图像乘法运算可以用来增强图像的对比度和亮度。例如,将一个图像和一个高亮度的常数图像相乘,可以使图像中较暗的区域变得更加明亮
  • 图像合成:图像乘法运算可以用来将两个图像合成成一个图像。例如,将一个图像和一个掩模图像相乘,可以将掩模中非零区域对应的像素从原图像中抠出来,生成一个新的合成图像
  • 模糊处理:图像乘法运算可以用来进行模糊处理。例如,将一个图像和一个低通滤波器的频率响应相乘,可以将图像中高频部分去除,从而实现模糊效果
  • 频谱分析:图像乘法运算可以用来进行频谱分析。例如,将一个图像和一个频率响应为单位圆的高通滤波器相乘,可以提取出图像中高频部分的信息,从而实现高通滤波效果
  • 噪声去除:图像乘法运算可以用来去除图像中的噪声。例如,将一个图像和一个频率响应为单位圆的低通滤波器相乘,可以将图像中高频部分去除,从而去除噪声

B:程序

MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册

immultiply(A,B,class)函数:

  • AB分别是输入的两幅图像
  • class:用于指定输出图像的数据类型
    • uint8:8位无符号整型
    • uint16:16位无符号整型
    • int16:16位有符号整型
    • single:单精度浮点型
    • double:双精度浮点型

实现如下效果
(数字图像处理MATLAB+Python)第三章图像基本运算-第二节:图像代数运算_第7张图片

Back=im2double(imread('bird.jpg'));
Templet=im2double(imread('birdtemplet.bmp'));
result = immultiply(Templet,Back);
subplot(131),imshow(Back),title('背景');
subplot(132),imshow(Templet),title('模板');
subplot(133),imshow(result),title('图像相乘');

Python实现:使用Python实现上述同样的功能

csv2.multiply函数:对输入的两个数组进行逐元素相乘,然后将结果写入输出数组中。在相乘过程中,如果元素的结果值超出了输出数组数据类型的表示范围,则结果将被截断。如果指定了缩放参数scale,则结果将被缩放到可接受的数据类型范围内。如果输出数组的数据类型未指定,则输出数组的数据类型与输入数组相同

  • src1:第一个数组,必须是单通道或多通道数组,数据类型为浮点型或整型。
  • src2:第二个数组,与第一个数组的形状和数据类型必须相同。
  • dst:输出数组,形状和数据类型与输入数组相同。
  • scale:可选参数,用于对结果进行缩放的标量值。默认值为1,即不进行缩放。
  • dtype:可选参数,输出数组的数据类型。如果未指定,则输出数组的数据类型与输入数组相同
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']

# 读取背景和模板图片
Back = cv2.imread('bird.jpg').astype(np.float32) / 255.0
Templet = cv2.imread('birdtemplet.bmp').astype(np.float32) / 255.0

# 计算图像相乘
result = cv2.multiply(Templet, Back)

# 展示结果
fig, ax = plt.subplots(1, 3, figsize=(12, 4))
ax[0].imshow(cv2.cvtColor(Back, cv2.COLOR_BGR2RGB))
ax[0].set_title('背景')
ax[1].imshow(cv2.cvtColor(Templet, cv2.COLOR_BGR2RGB))
ax[1].set_title('模板')
ax[2].imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
ax[2].set_title('图像相乘')
plt.show()

(数字图像处理MATLAB+Python)第三章图像基本运算-第二节:图像代数运算_第8张图片

(4)除法运算

A:概述

除法运算:是指将一个图像的每个像素值除以另一个图像的相应像素值,从而生成一个新的图像。则它们的除法运算可表示为

g ( x , y ) = f 1 ( x , y ) ÷ f 2 ( x , y ) g(x,y)=f_{1}(x,y) ÷ f_{2}(x,y) g(x,y)=f1(x,y)÷f2(x,y)

图像除法运算在某些应用中确实比加法、减法和乘法运算应用得少一些,但在某些特定情况下,它也是很有用。在某些图像处理应用中,图像除法可以用来纠正图像的光照不均匀性或颜色失真等问题。例如,在医学图像处理中,可以使用背景图像对包含目标的图像进行除法运算,以消除照明变化或其他干扰。此外,图像除法还可以用于图像对比度增强。在对比度增强的应用中,图像除法可以用来增强图像中的高频细节,例如边缘和纹理。通过将图像除以其平滑版本,可以增强高频信息,并使边缘和纹理更加明显

B:程序

MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册

imdivide(A,B,options)函数:是MATLAB中的一个图像处理函数

  • AB是两个输入的图像矩阵。需要注意的是,如果B中某个像素的值为0,则对应的像素在输出图像C中的值将为Inf(无穷大)。此外,如果输入矩阵包含浮点数,则输出矩阵也将是浮点数,否则输出矩阵将与输入矩阵具有相同的数据类型
  • options结构体包含以下字段
    • RoundingMethod:取值可以为'floor'(向下取整,默认值)、'ceil'(向上取整)、'fix'(取整数部分)、'round'(四舍五入),指定除法运算时的舍入方式。
    • NaNBehavior:取值可以为'omit'(省略NaN,默认值)或'replace'(用0代替NaN),指定如何处理B中包含NaN的情况

Python实现:使用Python实现上述同样的功能。需要注意的是,c2.divide函数不支持指定舍入方式或者NaN的处理方式。如果需要实现这些功能,需要手动编写代码实现

cv2.divide(src1, src2, dst=None, scale=1)函数:

  • src1src2是输入的两个图像
  • scale参数是一个标量,表示除以src2的缩放因子,默认值为1

二:图像逻辑运算

(1)概述

逻辑运算:在数字图像处理中,逻辑运算指的是使用逻辑运算将两个或更多的图像组合起来的操作。这些操作也被称为位操作,因为它们对图像中每个像素的各个位进行操作。数字图像处理中常用的逻辑运算包括

  • 与运算(AND):在这个操作中,两个输入图像中的相应像素被比较。如果两个像素都是非零(数值为1),输出像素被设置为1。否则,输出像素被设置为0(只要出现0结果就是0
  • 或运算(OR):在这个操作中,两个输入图像中的相应像素被比较。如果其中一个像素的值为1,则输出像素被设置为1。否则,输出像素被设置为0(只要出现1结果就是1
  • 异或运算(XOR):在这个操作中,两个输入图像中的相应像素被比较。如果像素有不同的值(一个像素是1,另一个是0),输出像素被设置为1。否则,输出像素被设置为0(0和任何数异或都是任何数,任何数与自己异或都是0
  • 取反运算(NOT):在这个操作中,输入图像中的每个像素都被反转。如果一个像素的值是1,它就被设置为0,反之亦然

(2)程序

MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册

  • C = bitcmp(A):按位求反
  • C = bitand(A,B):按位求与
  • C = bitor(A,B): 按位求或
  • C = bitxor(A,B):按位求异或

实现如下效果

(数字图像处理MATLAB+Python)第三章图像基本运算-第二节:图像代数运算_第9张图片

Back=imread('bird.jpg');
Templet=imread('birdtemplet.bmp');
result1=bitcmp(Back);
result2=bitand(Templet,Back);
result3=bitor(Templet,Back);
result4=bitxor(Templet,Back);
figure;
subplot(121),imshow(Back),title('Back');
subplot(122),imshow(Templet),title('Templet');
figure;
subplot(221),imshow(result1),title('图像求反');
subplot(222),imshow(result2),title('图像相与');
subplot(223),imshow(result3),title('图像相或');
subplot(224),imshow(result4),title('图像异或');

Python实现:使用Python实现上述同样的功能

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']

Back = cv2.imread('bird.jpg')
Templet = cv2.imread('birdtemplet.bmp')


result1 = cv2.bitwise_not(Back)
result2 = cv2.bitwise_and(Templet, Back)
result3 = cv2.bitwise_or(Templet, Back)
result4 = cv2.bitwise_xor(Templet, Back)


plt.subplot(221), plt.imshow(result1), plt.title('图像求反')
plt.subplot(222), plt.imshow(result2), plt.title('图像相与')
plt.subplot(223), plt.imshow(result3), plt.title('图像相或')
plt.subplot(224), plt.imshow(result4), plt.title('图像异或')
plt.show()

(数字图像处理MATLAB+Python)第三章图像基本运算-第二节:图像代数运算_第10张图片

你可能感兴趣的:(matlab,python,计算机视觉)