第五章 图像算术和逻辑OpenCV
目录
Opencv-python教程
前言
一、首先
二、看看我们可以做什么
1.叠加
2.使用addWeighted()函数
3.总的代码
三. 徽标移动到图片上
1.threshold函数
2.bitwise_not函数
总结
本系列文章纯属搬运工,来自个人阅读一个国外python-opencv的教学网的感悟,有关许可条例,遵循该网站,本系列文章仅作学习用途。
第四章将介绍一些可以在图像上执行的简单算术操作,并解释它们的作用。为了做到这一点,我们需要两个大小相同的图像,然后先是一个小的图像,然后是一个大的图像。
先把这两张图拿出来
import cv2
import numpy as np
#500X250
img1 = cv2.imread('3D-Matplotlib.png')
img2 = cv2.imread('mainsvmimage.png')
#相加的两幅图像必须类型,尺寸都相同
add = img1 + img2
cv2.imshow('add',add)
#函数waitkey(delay),等待dalay个ms时间
#返回值:如果delay>0,那么超过指定时间则返回-1;如果delay=0,将没有返回值。
#如果delay<0,等待时间无限长,返回值为按键值,delay单位为ms
cv2.waitKey(0)
cv2.destroyAllWindows()
结果
这种杂乱的添加看起来毫无头绪,事实上,可以尝试cv2.add()函数,该函数使用饱和添加模式。
#相加的两个图片大小类型必须相同
add = cv2.add(img1,img2)
效果,这个图像看起来有点偏白。
上图的add()函数得到的图像很大情况下并不是我们理想的。我们可以看到图像的大部分是非常白的。这是因为颜色是0-255,其中255是“全白”。因此对于两张图片相加后的RGB大于255将会等于255,比如:
(155,211,79) + (50, 170, 200) = 205, 381, 279...转换成 (205, 255,255)
.使用addWeighted()函数可以调整权重。
#权重加法
weighted = cv2.addWeighted(img1,0.6,img2,0.4,0)
cv2.addWeighted(图片1,权重值,图片二,权重值,光的测量值),这里将最后一个,伽马值设置为0,修改过后的效果如下。
import cv2
import numpy as np
#500X250
img1 = cv2.imread('3D-Matplotlib.png')
img2 = cv2.imread('mainsvmimage.png')
# #加法一
# # add = img1 + img2
#
# #加法二
# add = cv2.add(img1,img2)
#权重加法
weighted = cv2.addWeighted(img1,0.6,img2,0.4,0)
cv2.imshow('add',weighted)
cv2.waitKey(0)
cv2.destroyAllWindows()
如何将这个徽标移动到以上面的3D点阵图为背景的图片上呢。
代码为
import cv2
import numpy as np
#读入两个图片
img1 = cv2.imread('3D-Matplotlib.png')
img2 = cv2.imread('mainlogo.png')
#为了将logo放在图像左上角,需要创建一个ROI,读取logo的行,列像素宽度
rows,cols,channels = img2.shape
#roi划分的大小就是背景区域的大小。
roi = img1[0:rows,0:cols]
#现在创建一个logo的蒙版,创建一个它的相反的蒙版,颜色空间转换函数cvtColor(转换的目标图,转换的格式)
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
#加入一个阈值,threshod这个函数将高于某个通道的阈值改为目标阈值
#cv2.threshod(目标图像必须是单通道,进行分类的阈值,高于阈值所赋予的新值,选择的方法)
ret,mask = cv2.threshold(img2gray,220,255,cv2.THRESH_BINARY_INV)
#将输入数组的内容逐位取反
mask_inv = cv2.bitwise_not(mask)
#在ROI中对logo区域进行模糊处理,bitwise_and()按掩码进行按位与操作。
img1_bg = cv2.bitwise_and(roi,roi,mask=mask_inv)
#由于在logo图像中还存在其他空白区域,因此,下面将仅仅取含有logo区域部分
im2_fg = cv2.bitwise_and(img2,img2,mask=mask)
#叠加两幅图
dst = cv2.add(img1_bg,im2_fg)
img1[0:rows,0:cols] = dst
cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
threshold函数可以参考https://blog.csdn.net/a19990412/article/details/81172426
从上面的代码可以看到我们在这段代码中看到了不同的地方。第一段是关于threshold的应用,将在下一章
ret, mask = cv2.threshold(img2gray, 220, 255, cv2.THRESH_BINARY_INV)
中详细讲解threshold,它的功能是会将所有像素转换成黑色或白色,且以阈值为基础。在本段代码中使用的阈值是220,也可以使用其他值,甚至是动态的值,这就是ret的作用。
我们看到关于bitwise_not函数,这是一种按位操作。在这种情况下,不可见的部分是黑色的地方。然后,我们可以说我们想要在第一张图像中涂黑这个区域,然后取图像2并替换它的内容到那个空的位置。
mask_inv = cv2.bitwise_not(mask)
本章对opencv的加法——图像重叠做了一部分介绍。下一章将介绍更为详细的内容。