当前位置:   article > 正文

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

python 图像逻辑运算

Opencv-python教程

第五章 图像算术和逻辑OpenCV


目录

Opencv-python教程

前言

一、首先

二、看看我们可以做什么

1.叠加

2.使用addWeighted()函数

3.总的代码

三. 徽标移动到图片上

1.threshold函数

2.bitwise_not函数

总结


前言

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

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


 

一、首先

先把这两张图拿出来

二、看看我们可以做什么

1.叠加

  1. import cv2
  2. import numpy as np
  3. #500X250
  4. img1 = cv2.imread('3D-Matplotlib.png')
  5. img2 = cv2.imread('mainsvmimage.png')
  6. #相加的两幅图像必须类型,尺寸都相同
  7. add = img1 + img2
  8. cv2.imshow('add',add)
  9. #函数waitkey(delay),等待dalay个ms时间
  10. #返回值:如果delay>0,那么超过指定时间则返回-1;如果delay=0,将没有返回值。
  11. #如果delay<0,等待时间无限长,返回值为按键值,delay单位为ms
  12. cv2.waitKey(0)
  13. cv2.destroyAllWindows()

结果

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

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

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

2.使用addWeighted()函数

 

上图的add()函数得到的图像很大情况下并不是我们理想的。我们可以看到图像的大部分是非常白的。这是因为颜色是0-255,其中255是“全白”。因此对于两张图片相加后的RGB大于255将会等于255,比如:

(155,211,79) + (50, 170, 200) = 205, 381, 279...转换成 (205, 255,255).使用addWeighted()函数可以调整权重。

  1. #权重加法
  2. weighted = cv2.addWeighted(img1,0.6,img2,0.4,0)

cv2.addWeighted(图片1,权重值,图片二,权重值,光的测量值),这里将最后一个,伽马值设置为0,修改过后的效果如下。

3.总的代码

  1. import cv2
  2. import numpy as np
  3. #500X250
  4. img1 = cv2.imread('3D-Matplotlib.png')
  5. img2 = cv2.imread('mainsvmimage.png')
  6. # #加法一
  7. # # add = img1 + img2
  8. #
  9. # #加法二
  10. # add = cv2.add(img1,img2)
  11. #权重加法
  12. weighted = cv2.addWeighted(img1,0.6,img2,0.4,0)
  13. cv2.imshow('add',weighted)
  14. cv2.waitKey(0)
  15. cv2.destroyAllWindows()

三. 徽标移动到图片上

如何将这个徽标移动到以上面的3D点阵图为背景的图片上呢。

代码为

  1. import cv2
  2. import numpy as np
  3. #读入两个图片
  4. img1 = cv2.imread('3D-Matplotlib.png')
  5. img2 = cv2.imread('mainlogo.png')
  6. #为了将logo放在图像左上角,需要创建一个ROI,读取logo的行,列像素宽度
  7. rows,cols,channels = img2.shape
  8. #roi划分的大小就是背景区域的大小。
  9. roi = img1[0:rows,0:cols]
  10. #现在创建一个logo的蒙版,创建一个它的相反的蒙版,颜色空间转换函数cvtColor(转换的目标图,转换的格式)
  11. img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
  12. #加入一个阈值,threshod这个函数将高于某个通道的阈值改为目标阈值
  13. #cv2.threshod(目标图像必须是单通道,进行分类的阈值,高于阈值所赋予的新值,选择的方法)
  14. ret,mask = cv2.threshold(img2gray,220,255,cv2.THRESH_BINARY_INV)
  15. #将输入数组的内容逐位取反
  16. mask_inv = cv2.bitwise_not(mask)
  17. #在ROI中对logo区域进行模糊处理,bitwise_and()按掩码进行按位与操作。
  18. img1_bg = cv2.bitwise_and(roi,roi,mask=mask_inv)
  19. #由于在logo图像中还存在其他空白区域,因此,下面将仅仅取含有logo区域部分
  20. im2_fg = cv2.bitwise_and(img2,img2,mask=mask)
  21. #叠加两幅图
  22. dst = cv2.add(img1_bg,im2_fg)
  23. img1[0:rows,0:cols] = dst
  24. cv2.imshow('res',img1)
  25. cv2.waitKey(0)
  26. cv2.destroyAllWindows()

threshold函数可以参考https://blog.csdn.net/a19990412/article/details/81172426

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的加法——图像重叠做了一部分介绍。下一章将介绍更为详细的内容。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/929321
推荐阅读
相关标签
  

闽ICP备14008679号