图像处理基础:掌握图像算术运算 您所在的位置:网站首页 逻辑加法的例子及解释视频 图像处理基础:掌握图像算术运算

图像处理基础:掌握图像算术运算

2024-07-16 21:38| 来源: 网络整理| 查看: 265

图像算术运算

图像加减法在数字图像处理中应该属于一个章节的内容并且应该还包括其他的,现在给我关于这个章节的全部内容,从加减法出发带我学习给我清晰的框架,能具体到可上手的实际操作例子吗

在数字图像处理中,图像的算术运算是基本操作之一,通常包括加法、减法、乘法和除法。这些操作可以用于多种目的,比如增强图像、背景去除、噪声去除、图像融合等。以下是关于这一章节内容的框架,包括理论基础和实际操作的例子。

章节内容框架: 图像加法: 用于合并两幅图像或增加亮度。注意可能的溢出问题,即像素值超过255。 图像减法: 用于背景去除或突出图像差异。可以用于帧间差分,检测视频中的移动物体。 图像乘法: 用于调整图像的对比度或创建遮罩效果。乘法可以强化图像的特定区域。 图像除法: 用于归一化处理或去除光照不均的效果。可以用于改善图像的整体视觉效果。 逻辑运算: 包括AND、OR、NOT和XOR等操作。用于遮罩、位图处理等。 位平面分割: 分离图像的每个位平面。用于分析图像内容的不同层次。 直方图相关操作: 直方图均衡化和匹配。用于增强图像的对比度和亮度调整。 实际操作例子: 图像加法: pythonCopy code import cv2 import numpy as np # 读取两个图像 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') # 确保图像大小相同 img2 = cv2.resize(img2, img1.shape[1::-1]) # 加法操作 result_add = cv2.add(img1, img2) cv2.imshow('Added Image', result_add) cv2.waitKey(0) cv2.destroyAllWindows() 图像减法: pythonCopy code # 减法操作 result_subtract = cv2.subtract(img1, img2) cv2.imshow('Subtracted Image', result_subtract) cv2.waitKey(0) cv2.destroyAllWindows() 图像乘法(对比度调整): pythonCopy code # 乘法操作 result_multiply = cv2.multiply(img1, 1.5) # 1.5是乘法因子,用于调整对比度 cv2.imshow('Multiply Image', result_multiply) cv2.waitKey(0) cv2.destroyAllWindows() 图像除法(去除光照不均): pythonCopy code # 除法操作 img1 = cv2.add(img1, 50) # 增加亮度以模拟光照不均 result_divide = cv2.divide(img1, img2) cv2.imshow('Divided Image', result_divide) cv2.waitKey(0) cv2.destroyAllWindows() 直方图均衡化(增强对比度): pythonCopy code # 灰度图像直方图均衡化 gray_img = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) equ = cv2.equalizeHist(gray_img) cv2.imshow('Equalized Image', np.hstack((gray_img, equ))) cv2.waitKey(0) cv2.destroyAllWindows()

在应用这些算术运算时,通常需要考虑像素值的数据类型和可能的溢出问题。OpenCV中的**cv2.add()和cv2.subtract()函数会自动处理这些溢出问题,但如果你使用像img1 + img2**这样的直接加法,就需要注意处理数据类型和溢出。使用图像算术运算时,还要注意图像的尺寸和通道数必须

从图像乘法开始,告诉我为什么这样操作后就能有那些效果,比如图像减法我猜想原理是:“用于背景去除或突出图像差异。【这是因为怎么减都是绝对值增大,代表亮色即前景】”

图像算术运算中的每一种操作都有其特定的效果和应用场景,这些效果源于基本的像素级操作。以下是对这些运算效果的解释:

图像乘法(对比度调整):

原理:

图像乘法涉及将图像的每个像素值乘以一个常数(称为乘法因子)。当乘法因子大于1时,结果图像的像素值会增加,使得亮的区域变得更亮,同时暗的区域变得更暗,因此对比度增强。当乘法因子小于1时,相反,图像会变暗,对比度减少。

效果:

这种操作改变了图像的亮度分布,通常用于增强图像的对比度。如果没有适当的缩放,可能会导致亮度值溢出(即超过255),从而导致信息丢失。 图像减法(背景去除或突出差异):

原理:

图像减法是通过计算两幅图像对应像素值的差来完成的。在许多情况下,一幅图像代表当前状态,而另一幅图像代表背景或参考状态。当两幅图像相减时,相同或静止不动的部分(背景)接近于零(黑色),而变化或移动的部分保留下来(亮色)。

效果:

这种方法常用于突出图像之间的变化,如在运动检测中识别移动的物体。也可以用于消除静态背景,保留变化的前景。 图像乘法和除法(创建遮罩和归一化):

原理:

乘法可以用来创建遮罩,通过乘以一个二值图像(遮罩),只有遮罩中白色(值为1)的部分保留原始图像的像素值,其余部分变为黑色。除法通常用于归一化,如通过将图像除以一个平均值或光照图像,可以减少光照不均导致的影响。

效果:

乘法可以强化或弱化图像中的某些区域。除法可以提高图像整体的视觉一致性,特别是在光照变化的情况下。

在实际操作中,这些算术运算之前通常会伴随着一些预处理步骤,如类型转换、尺寸匹配等,以确保运算的正确执行。另外,特别是在减法和除法操作中,可能需要额外的步骤来处理负值或避免除以零的情况。

“乘法可以用来创建遮罩,通过乘以一个二值图像(遮罩),只有遮罩中白色(值为1)的部分保留原始图像的像素值,其余部分变为黑色。”什么意思

在数字图像处理中,遮罩(Masking)是一种技术,它允许你指定图像的哪些部分应该被处理,而哪些部分应该被忽略或保持不变。遮罩通常是一个二值图像,也就是说,图像中的每个像素非黑即白,通常用白色表示感兴趣的区域(ROI),用黑色表示不感兴趣的区域。

当你使用乘法操作时,原图像中的每个像素值会与遮罩图像中相应位置的像素值相乘。这里是如何操作的:

如果遮罩像素值为1(通常对应于255的白色像素),那么乘法操作后原图像的像素值不变。如果遮罩像素值为0(黑色像素),原图像的像素值变为0,即变黑。

通过这种方法,原始图像中与遮罩中白色相对应的部分被“保留”或“强调”,而其余部分则被“隐藏”或“去除”。这种技术在图像分割、特征提取等多种应用中非常有用。

这里是一个简单的代码示例,演示如何使用遮罩来保留图像的特定区域:

pythonCopy code import cv2 import numpy as np # 读取图像 image = cv2.imread('path_to_image.jpg') # 创建一个与原图像同样大小的遮罩,初始化全为黑色 mask = np.zeros(image.shape[:2], dtype="uint8") # 在遮罩上定义一个白色的矩形区域 cv2.rectangle(mask, (x_start, y_start), (x_end, y_end), 255, -1) # 将遮罩应用到图像上:只有白色区域的像素会被保留 masked_image = cv2.bitwise_and(image, image, mask=mask) cv2.imshow('Masked Image', masked_image) cv2.waitKey(0) cv2.destroyAllWindows()

在这个示例中,cv2.bitwise_and 函数实际上执行了遮罩操作,它可以看作是逐像素的乘法操作,遮罩中的白色区域对应于值为1的像素,而黑色区域对应于值为0的像素。因此,只有在遮罩白色区域内的原图像像素才会出现在结果中。

还是不懂

好的,我来用一个更简单的例子来解释。

想象一下,你有一张黑白照片(即灰度图像),现在你想要高亮显示图像的一个特定区域,比如图像中心的一个圆形区域,而让其他部分变暗。

首先,你创建一个遮罩图像,这个遮罩图像的大小与你的原始图像相同。在这个遮罩图像中,你的目标区域(我们的例子中是圆形区域)是白色的,而图像的其他部分是黑色的。白色部分的像素值是1(或者在实际的图像处理中,通常是255),黑色部分的像素值是0。

然后,你将这个遮罩图像与原始图像相乘。乘法的效果如下:

对于遮罩中的黑色区域(值为0的像素),与原图像中对应像素相乘后,结果也是0(黑色),这意味着这些区域在结果图像中将完全变暗。对于遮罩中的白色区域(值为1或255的像素),与原图像中对应像素相乘后,结果是原始像素的值不变(因为任何数与1相乘都是其本身),这意味着这些区域在结果图像中将保持原样。

通过这种方式,遮罩帮助你选择性地高亮或隐藏原图像的某些部分。

在代码中,通常我们使用255来表示遮罩的白色区域,因为图像的像素值通常是在0到255的范围内表示。而且,由于计算机中的乘法是按位计算的,我们通常使用**bitwise_and**操作而不是直接的乘法。这个操作对每个像素的二进制表示执行AND操作,得到的效果与我们讨论的乘法是一样的。

这就是为什么我们说乘法可以用来创建遮罩效果。希望这个解释清楚了遮罩如何工作,以及它是如何通过图像乘法实现的。

可是乘以1之后也没有变亮啊?只是其他区域变黑了

当您将图像与一个二值遮罩相乘时(在这里,遮罩中的值通常设置为0和255),实际上您并不是在使图像变亮,而是在选择性地保留遮罩中为255的那些区域的像素值。这意味着遮罩中值为255的地方保留原始图像的亮度和颜色,而遮罩中值为0的地方变黑。

乘法运算在这里的作用是:

对于遮罩中值为0的像素(黑色部分):与原图像中相应位置的像素相乘,结果是0,因此在这些位置上,原图像的像素变为黑色。对于遮罩中值为255的像素(白色部分):由于计算机图像中的值通常在0到255之间,所以255相当于乘法中的1。这意味着原图像在这些位置上的像素值保持不变。

因此,如果您的目的是要高亮显示某个区域,单纯的乘法(与二值遮罩相乘)不会使任何区域变亮。相反,如果您想要高亮显示某个区域,您可能需要:

先将整个图像变亮(例如,通过加法或直方图均衡化)。然后应用遮罩以保持特定区域的亮度,同时将其他区域变暗。

如果我们想用代码来实现这个过程,可以这样做:

pythonCopy code import cv2 import numpy as np # 读取图像 image = cv2.imread('path_to_image.jpg') # 增加亮度 brighter_image = cv2.add(image, np.array([50.0])) # 假设增加亮度值为50 # 创建一个遮罩,中间是白色圆形,其他部分为黑色 mask = np.zeros(image.shape[:2], dtype="uint8") cv2.circle(mask, (mask.shape[1]//2, mask.shape[0]//2), 100, 255, -1) # 圆形遮罩 # 应用遮罩,保留圆形区域的亮度 masked_image = cv2.bitwise_and(brighter_image, brighter_image, mask=mask) # 显示图像 cv2.imshow('Original Image', image) cv2.imshow('Brighter Image', brighter_image) cv2.imshow('Masked Image', masked_image) cv2.waitKey(0) cv2.destroyAllWindows()

在这段代码中,我们先通过加法增加了图像的亮度,然后通过**bitwise_and**和圆形遮罩应用这个变亮的效果仅在圆形区域内,其他区域保持原图的亮度。这样就可以达到高亮圆形区域的效果。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有