免费送书啦!畅销书《OpenCV图像处理入门与实践》一本全搞定转载

原创
小哥 3年前 (2022-10-17) 阅读数 45 #大杂烩

OpenCV 基本图像操作仅对图像中的像素点执行,而不是对整个图像执行。在许多情况下,仅通过更改像素点来操作图像是不可能的,因此我们需要学习图像上的算术运算。

1.图像加法

对于大小相同的两个图像,您可以使用 cv2.add 函数来添加它们。使用此函数时, 两个图像的大小必须相同,或者加法必须是简单的标量。

cv2.add(img1,img2)

cv2.add 把两个图像放在上面的操作是把两个图像放在上面的操作 像素值与以下语法相加。其参数分别说明如下。

 img1:要添加的数字,即第一个图像。

 img2:加法器,即第二图像,也可以是简单的标量。

2.OpenCV 与 NumPy 模算术加法的差异模算术加法的差异

从第 1 正如我们在第一章中已经知道的,图像在程序中以矩阵的形式存储,因此我们也可以使用矩 数组加法,执行两个图像像素点的求和。除了……之外 OpenCV 中的 cv2.add 除了函数之外,我们还可以使用 NumPy 模块来执行图像的添加。模块来执行图像添加。

但是,由于以下原因,两者在某些情况下可能会产生不同的结果 OpenCV 和 NumPy 模块处理溢出的方式模块处理溢出的方式模块处理溢出的方式 方法是不同的。溢出的原因是什么?例如,如果单通道图像的像素点值为 250,在另一个图像上的另一个图像上,另一个图像在另一个图像上 同一位置的像素点的值为 10那么这两者的总和是 260像素值的上限是像素值的上限是 255所以这个,所以这个 当我们遇到溢出问题时。当我们遇到溢出问题时。我们遇到了溢出问题,当我们

OpenCV 处理溢出的方法是饱和操作,而 NumPy 模块处理溢出的方式模块处理溢出的方式模块处理溢出的方式法是模操作。例如, 在 OpenCV 在遇到的情况下遇到的情况在您遇到 250+10=260 在这种情况下,它会选择最大值,在这种情况下,它会选择最大值,在这种情况下,它会选择最大值 255;而在 NumPy 模块中, 它等同于执行(与执行(250+10)%255=5根据我们的理解,我们一般更愿意看到 OpenCV 中的 结果,和 NumPy 该模块的结果与原始图像的结果相对不同,因此在对图像执行运算时 与加法时相比,与加法时相比 NumPy 模块,我们更喜欢使用模块 OpenCV。

3.图像添加练习图像添加练习图像添加练习

了解了 NumPy 模块以及 OpenCV 在图像中添加的图像之间的差异之后,现在让我们来一个实际的演练。这 使用了两个差异较大的图像来测试代码,如 1 和图 2展示了。现在我们通过 cv2.add 函数对这两个图像执行图像的算术相加,示例代码如下所示。示例代码如下所示。示例代码如下所示。示例代码如下所示。

import cv2 
import numpy 
img1=cv2.imread(1.jpg) 
img2=cv2.imread(2.jpg) 
img3=cv2.add(img1,img2) 
cv2.imshow(img,img3)
cv2.waitKey(0)
 cv2.destroyAllWindows()

图1     星形图                               图2     心形图

运行代码后,结果如图所示3 所示。

图 3      图像相加结果图像相加结果

4.图像加权

我们执行的简单的图像直接算术加法只是将两个图像的像素值相加, 没有进行其他手术。下面是权重概念的介绍,用于 cv2.add 函数的组合的图像,它的图像 素值设为 c,图 1 所示图像的像素值设置为 a,图 2所示图像的像素值设置为 b,那么 c=a+b, 在这种情况下,两边的权重相等。但我们可以更改这两个图像的百分比,例如,第一个图像的百分比为 70%, 第二个图像共享第二个图像百分比第二个图像与百分比 30%,在这个时候,这个时候,这个时候 c=0.7×a+0.3×b如果我们还需要添加常量如果我们还需要添加常量如果我们需要添加常量;如果我们需要添加常量 k然后整个公式 分会变成分会变成分会 c=0.7×a+0.3×b+k。对于此实现,我们可以使用 cv2.addWeighted 函数及其函数语言 法如下。

cv2.addWeighted(src1,alpha,src2,beta,gamma)

它们的参数分别说明如下。这些参数如下所述。

 src1:第一张图片。:第一张图片。

 alpha:第一个图像的权重。:第一个图像的权重。

 src2:第二张图片。:第二张图片。

 beta:第二个图像的权重。:第二个图像的权重。

 gamma:附加常量。:附加常量。:附加常量。:附加常量。

示例代码如下所示。示例代码如下所示。示例代码如下所示。示例代码如下所示。

img=cv2.addWeighted(img1,0.2,img2,0.3,10)

现在我们对图形感兴趣现在我们对图形感兴趣现在我们对图感兴趣现在我们对图形感兴趣 1 所示图像和图形所示的图像和图形所示的图像和图表 2 所显示的图像通过具有常量的运算加权 k 的取值为 0, 示例代码如下所示。示例代码如下所示。示例代码如下所示。示例代码如下所示。

import cv2 
import numpy 
img1=cv2.imread(1.jpg) 
img2=cv2.imread(2.jpg) 
img3=cv2.addWeighted(img1,0.7,img2,0.3,0) 
cv2.imshow(img,img3) 
cv2.waitKey(0) 
cv2.destroyAllWindows()

图像加权结果图像加权结果图像加权结果如图所示,图像加权结果图像加权结果图像加权结果如图所示。 4 所示。

图 4    图像加权结果图像加权结果图像加权结果

也可以传递常量,也可以传递常量,也可以传递常量 k 将一个固定值添加到整个图像的所有像素,阅读器可以修改代码以 实现。

5.图像逻辑运算图像逻辑运算

在这里介绍面具(这里我们将介绍面具(这里我们想介绍面具(面具在这里介绍(mask“面具”的概念从字面上讲就是一种用来掩盖的电影。面具有很多角色,所以这里简单介绍一下。

 用于提取要捕获的区域和区域:提取感兴趣区域和预制的感兴趣区域(ROI带有待处理图像的蒙版)蒙版和待处理图像)蒙版和待处理图像 乘法(即逻辑求和运算)以获得感兴趣区域图像,感兴趣区域中的图像值保持不变,并且感官 感兴趣区域之外的图像值为 0。

 遮罩:对图像的某些区域进行遮蔽以避免处理,用于减少计算量 体积;也可以只对屏蔽区进行处理或统计。

 执行结构特征提取:使用相似性变量或图像匹配方法检测并提取图像中与蒙版相似的结点 构特征。

 创建特殊形状的图像:图像上覆盖着所需形状的蒙版(类似于Play-Doh的模具)。在用于基本图像操作的所有操作功能中,任何具有掩码的处理功能都具有参与操作(输入)的掩码 (然后对图像进行功能逻辑运算,然后对掩模图像或矩阵进行相关运算)。在计算机视觉中,我们通常使用以下逻辑运算。

逻辑非的语法如下。逻辑非的语法如下。

cv2.bitwise_not(img,mask=None) #逐位反转图像中的像素值逐位反转图像中的像素值

Logical With的语法如下。Logical With的语法如下。逻辑求和的语法如下所示。

cv2.bitwise_and (img1,img2,mask=None) #图像中的像素值与

逻辑或的语法如下。逻辑或的语法如下。逻辑或的语法如下所示。逻辑或的语法如下所示。

cv2.bitwise_or(img1,img2,mask=None) #按位转换图像中的像素值或

逻辑iso-or的语法如下。

cv2.bitwise_xor (img1,img2,mask=None) #按位区分图像中的像素值按位区分图像中的像素值

它们的参数分别说明如下。这些参数如下所述。

 img:处理后的图像。:已处理的图像。:已处理的图像。

 img1:在其中执行操作的第一个图像。

 img2:在其中执行操作的第二个图像。

 mask:用于执行操作的掩码,默认为无掩码。按位运算的详细信息如下。

 AND:当且仅当两个像素值都大于 0 如果这是真的,那就是真的。当这是真的时。时间是真的。只有在时机成熟的时候,这才是正确的。

 OR:如果两个像素值中的任何一个大于 0如果这是真的,那么它就是真的。

 XOR:ISO-OR,当且仅当用于ISO-OR计算的两个像素值转换为二进制时。

 NOT:反转图像中的“开”和“关”像素值。让我们逐一看看逻辑运算的效果。

首先是要图,图首先是图,图是 1 所示的图像进行逻辑非运算逻辑非运算逻辑非运算,示例代码如下所示。示例代码如下所示。示例代码如下所示。示例代码如下所示。

import cv2 
import numpy 
img=cv2.imread(1.jpg,0) 
img=cv2.bitwise_not(img) 
cv2.imshow(img,img)
cv2.waitKey(0) 
cv2.destroyAllWindows()

注:在这里,作者直接以灰度图的形式阅读,如图 1显示的图像只是黑白的,所以 被看作是一个二元图。被看作是一个二元的阴谋。被视为二叉图。被看作是一个二叉图。

运行代码,效果如图所示5 所示。

下面我们介绍下图我们介绍下面的图我们介绍图 2 显示的用作人物蒙版的图像5 所示图像受到掩码逻辑非的影响 运算,  示例代码如下所示。示例代码如下所示。示例代码如下所示。示例代码如下所示。

import cv2 
import numpy 
img1=cv2.imread(1.jpg,0) 
mask=cv2.imread(2.jpg,0) 
img=cv2.bitwise_not(img1,mask=mask) 
cv2.imshow(img,img)
 cv2.waitKey(0) 
cv2.destroyAllWindows()

运行代码后,结果如下所示6 所示。

图 5       逻辑非运算逻辑非运算逻辑非运算                    图 6   屏蔽逻辑非运算屏蔽逻辑非运算逻辑非运算逻辑非运算

观察图6,你可以看到图表,你可以看到图形,你可以看到图表你可以看到图表 2 所示的黑色部分(逻辑所示的黑色部分(逻辑)所示的黑色部分(逻辑所示的黑色部分(逻辑 0)与图 5显示的白色部分的重量 覆盖变得模糊,这是遮罩的效果。

让我们尝试通过首先创建一个正方形图来执行其他逻辑操作,如图所示 7 所示。我们将方形图作为掩膜,对星形图和心形图进行屏蔽逻辑和操作屏蔽逻辑和算术,示例代码如下所示。示例代码如下所示。示例代码如下所示。示例代码如下所示。

import cv2 
import numpy 
img1=cv2.imread(1.jpg,0) 
img2=cv2.imread(2.jpg,0) 
mask=cv2.imread(3.jpg,0) 
img=cv2.bitwise_and(img1,img2,mask=mask) 
cv2.imshow(img,img)
 cv2.waitKey(0) 
cv2.destroyAllWindows()

运行代码的结果如图所示8 所示。

图7     方形图                            图8    屏蔽逻辑和操作屏蔽逻辑和算术

因为掩码的中心是合乎逻辑的 0所以中间的部分都被锁住了。接下来,让我们对星形图和心形图执行屏蔽逻辑或和屏蔽逻辑异或操作,屏蔽 公式的逻辑或运算代码如下所示。

import cv2 
import numpy 
img1=cv2.imread(1.jpg,0) 
img2=cv2.imread(2.jpg,0) 
mask=cv2.imread(3.jpg,0) 
img=cv2.bitwise_or(img1,img2,mask=mask) 
cv2.imshow(img,img) 
cv2.waitKey(0) 
cv2.destroyAllWindows()

屏蔽的逻辑异或运算的代码如下。

import cv2 
import numpy 
img1=cv2.imread(1.jpg,0) 
img2=cv2.imread(2.jpg,0) 
mask=cv2.imread(3.jpg,0) 
img=cv2.bitwise_xor(img1,img2,mask=mask) 
cv2.imshow(img,img) 
cv2.waitKey(0) 
cv2.destroyAllWindows()

这两段代码的结果如图所示 9 与图 10所示。

蒙版主要用于颜色跟踪,即在指定要跟踪的颜色后,跟踪指定颜色的对象的运动。

注意:对于掩码,建议使用二叉图,因为它本身就是一种逻辑意义 0 和逻辑 1它对应于与两个对应的两个对应的两个 值图中的 0 和 255。

图9     屏蔽逻辑或操作屏蔽逻辑或操作          图 10    屏蔽逻辑异或操作屏蔽逻辑异或操作屏蔽逻辑异或操作

这篇文章节选自这篇文章是节选自这篇文章 OpenCV荣家琪著的《图像处理导论与实践》一文,经人民邮电出版社许可,已转载。

文末赠书

OpenCV 4详细教程,基于详细教程,基于详细教程,基于Python语言实现,性能分析利用语言实现,性能分析使用OpenCV 4完成图像处理的基本操作,结合项目实践,实际应用场景,带源代码,讲解视频和PPT。

如何获得这本书如何获得这本书

如果你想要这本书,你可以在下面的公共号码的背景中找到他,输入:Little Helper to Get It。码字:opencv 。需要它的学生很快就会来。

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门