赞
踩
第五章 图像算术和逻辑OpenCV
目录
本系列文章纯属搬运工,来自个人阅读一个国外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的加法——图像重叠做了一部分介绍。下一章将介绍更为详细的内容。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。