专注合肥网站推广,商城网站模板免费,深圳移动网站建设公司排名,5成都网站建设目录
一、简单数值计算
二、opencv中提供函数进行计算
三、cv2.addWeighted 一、简单数值计算
在opencv中#xff0c;我们有许多可以获取图像各类数值的办法#xff0c;许多函数能获得各种方面的数据。但如果我们什么都不用#xff0c;仅仅对图像上每一个点做加法运算会…目录
一、简单数值计算
二、opencv中提供函数进行计算
三、cv2.addWeighted 一、简单数值计算
在opencv中我们有许多可以获取图像各类数值的办法许多函数能获得各种方面的数据。但如果我们什么都不用仅仅对图像上每一个点做加法运算会发生什么
import cv2img1 cv2.imread(3.jpg)img2 img1 10print(img1[:5,:,0])
print(img2[:5,:,0])cv2.imshow(img1, img1)
cv2.imshow(img2, img2)cv2.waitKey(0)
这里我们先导入opencv库然后将名为“3.jpg”的图片读进来。 回忆一下imread()函数返回的是一个Numpy数组这个数组通常是三维数组包含了高度、宽度、通道数。对于彩色图像通道数一般为3。
第4行让img2img110相当于给读进来的图像的每一像素的三个通道都加了10。
代码第6行使用数组的知识创建了一个图像的前 5 行像素的第一个通道的切片并将其打印出来最后将原来的图像和改变后的图像显示出来如下图所示 可以看到新的图像已经不成样子了。对比前后输出的两个二维列表可以发现列表中的每一个值都加了10但有的直接变成了个位数。 这是因为列表中的每个值只能从0~255这256个值中选择一个但25410264已经超出了255的范围所以在求余256后得到了新的图像值。
接下来我们让两个图像的值直接相加看看会发生什么。
import cv2img1 cv2.imread(3.jpg)
img2 cv2.imread(4.jpg)img3 img1 img2print(img3[:5,:,1])cv2.imshow(img3, img3)cv2.waitKey(0)
这里前面的步骤与上面一样这里多读进来一张图片并将两张图片直接相加结果赋值给img3并将img3显示出来。
可是运行却出现了如下报错 这个报错的意思是在执行img1img2的代码时程序发现用来相加的两个数组高度、宽度不一样所以没有办法相加。这告诉我们在执行图像加法时两个图像的高度、宽度、通道都必须一致。
我们修改一下代码
import cv2img1 cv2.imread(3.jpg)
img2 cv2.imread(4.jpg)img1 cv2.resize(img1, (272, 245))img3 img1 img2print(img3[:5,:,1])cv2.imshow(img3, img3)cv2.waitKey(0)
这里我们在执行加法之前加了一个cv2.resize函数重新设定了img1图像的大小使其与img2相同。这样就能执行加法了运行结果如下 看起来还是蛮掉san的。
二、opencv中提供函数进行计算
但其实opencv中给我们提供了一个加法函数cv2.add()它与加法的区别在哪里我们来运行看一下
import cv2img1 cv2.imread(3.jpg)
img2 cv2.imread(4.jpg)img1 cv2.resize(img1, (272, 245))img3 cv2.add(img1, img2)print(img3[:5,:,1])cv2.imshow(img1, img1)
cv2.imshow(img2, img2)
cv2.imshow(img3, img3)cv2.waitKey(0) 在输出的列表中可以看到上次超出255范围被求余的数值现在统统变成了255相当于越界的数值被强制设置为了255不再进行求余操作。
但是很明显这样的图像相加并没有满足我们的要求得到的图像都没法看。怎么办呢opencv也提供了相应的函数给我们使用。
三、cv2.addWeighted
在opencv中cv2.addWeighted函数用于更加精准的图片叠加。数学计算的公式为 其中R代表叠加后的图像 代表参与叠加的两个图像和分别代表两张图像的权重b代表标量值加到加权和上。
在代码中需要这么写
import cv2img1 cv2.imread(3.jpg)
img2 cv2.imread(4.jpg)img1 cv2.resize(img1, (272, 245))img3 cv2.addWeighted(img1, 0.4, img2, 0.6, 0)print(img3[:5,:,1])cv2.imshow(img1, img1)
cv2.imshow(img2, img2)
cv2.imshow(img3, img3)cv2.waitKey(0)
这段代码中cv2.addWeight()传入了五个参数分别是叠加图像1图像1的权重叠加图像2图像2的权重以及标量值b。
运行结果如下 这样看起来图像的叠加就不会显得生硬了。