Opencv-python教程(5)——图像算术和逻辑OpenCV

Opencv-python教程

第五章 图像算术和逻辑OpenCV


目录

Opencv-python教程

前言

一、首先

二、看看我们可以做什么

1.叠加

2.使用addWeighted()函数

3.总的代码

三. 徽标移动到图片上

1.threshold函数

2.bitwise_not函数

总结


前言

本系列文章纯属搬运工,来自个人阅读一个国外python-opencv的教学网的感悟,有关许可条例,遵循该网站,本系列文章仅作学习用途。

第四章将介绍一些可以在图像上执行的简单算术操作,并解释它们的作用。为了做到这一点,我们需要两个大小相同的图像,然后先是一个小的图像,然后是一个大的图像。


 

一、首先

先把这两张图拿出来

Opencv-python教程(5)——图像算术和逻辑OpenCV_第1张图片Opencv-python教程(5)——图像算术和逻辑OpenCV_第2张图片

二、看看我们可以做什么

1.叠加

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()

结果

Opencv-python教程(5)——图像算术和逻辑OpenCV_第3张图片

这种杂乱的添加看起来毫无头绪,事实上,可以尝试cv2.add()函数,该函数使用饱和添加模式。

#相加的两个图片大小类型必须相同
add = cv2.add(img1,img2)

效果,这个图像看起来有点偏白。

Opencv-python教程(5)——图像算术和逻辑OpenCV_第4张图片

2.使用addWeighted()函数

 

上图的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,修改过后的效果如下。

Opencv-python教程(5)——图像算术和逻辑OpenCV_第5张图片

3.总的代码

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点阵图为背景的图片上呢。

Opencv-python教程(5)——图像算术和逻辑OpenCV_第6张图片

代码为

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

Opencv-python教程(5)——图像算术和逻辑OpenCV_第7张图片

1.threshold函数

从上面的代码可以看到我们在这段代码中看到了不同的地方。第一段是关于threshold的应用,将在下一章

ret, mask = cv2.threshold(img2gray, 220, 255, cv2.THRESH_BINARY_INV)

中详细讲解threshold,它的功能是会将所有像素转换成黑色或白色,且以阈值为基础。在本段代码中使用的阈值是220,也可以使用其他值,甚至是动态的值,这就是ret的作用。

2.bitwise_not函数

我们看到关于bitwise_not函数,这是一种按位操作。在这种情况下,不可见的部分是黑色的地方。然后,我们可以说我们想要在第一张图像中涂黑这个区域,然后取图像2并替换它的内容到那个空的位置。

mask_inv = cv2.bitwise_not(mask)

 


总结

本章对opencv的加法——图像重叠做了一部分介绍。下一章将介绍更为详细的内容。

你可能感兴趣的:(人工智障,opencv,python,人工智能)