Python+OpenCV学习(五)图像算数运算

内容包括图像混合、图像按位计算

图像相加

cv.add()函数,或者直接把两个矩阵相加得到新的图像。这样相加要保证两个相加的矩阵行和列是相同的。这两个方法在得数小于255时是相同的,但是当得数大于255时,cv.add()函数取最大值255,而直接两个矩阵相加,是取模运算。

import numpy as np
import cv2 as cv
x = np.uint8([250])
y = np.uint8([10])
print( cv.add(x,y) ) # 250+10 = 260 => 255
print( x+y )          # 250+10 = 260 % 256 = 4

OpenCV函数能够得到更好的结果,通常都使用cv.add()函数。

图像混合

这是另一种图像叠加方法,更像是我们理解的叠加。它通过 cv.addWeighted() 函数实现。它给图像赋予不同的权重,使其产生混合或透明的效果。它由如下公式实现:

dst = src1*alpha + src2*beta + gamma

Demo:

import cv2 as cv
img1 = cv.imread('demo1.jpg')
img2 = cv.imread('demo2.jpg')
img3 = cv.addWeighted(img1,0.5,img2,0.5,0)

按位运算

这包括了与,或,非,异或运算。如果直接用cv.add()函数,那么图片的颜色就改变了;如果用cv.addWeighted() 函数,那么图片就变得透明了。如果不透明相加的话(把云朵当成帽子加到猫头上),请看:

# coding=utf-8
import cv2 as cv
# 读取两张图片
img1 = cv.imread('d:\\cat.jpg')
img2 = cv.imread('d:\\cloud.jpg')
# 创建一个RIO
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
# 创建云朵的mask和反mask
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
# 二值化处理灰度图
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
# 二值图反色处理
mask_inv = cv.bitwise_not(mask)
# Now black-out the area of logo in ROI
# 消去ROI中的云朵
# ROI和ROI分别与反mask按位与 然后他们的结果按位与
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
# 取出云朵图中的云朵
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
# 把云朵放入ROI区域
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()


什么是掩膜(mask)(参考文章

数字图像处理中的掩膜的概念是借鉴于PCB制版的过程,在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形“底片”称为掩膜(也称作“掩模”),其作用是:在硅片上选定的区域中对一个不透明的图形模板遮盖,继而下面的腐蚀或扩散将只影响选定的区域以外的区域。
图像掩膜与其类似, 用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。
光学图像处理中,掩模可以是胶片、滤光片等。数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。数字图像处理中,图像掩模主要用于:
  1. 提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。
  2. 屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
  3. 结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
  4. 特殊形状图像的制作。

掩膜是一种图像滤镜的模板,实用掩膜经常处理的是遥感图像。当提取道路或者河流,或者房屋时,通过一个n*n的矩阵来对图像进行像素过滤,然后将我们需要的地物或者标志突出显示出来。这个矩阵就是一种掩膜。

    dst = cv.bitwise_and( src1, src2[, dst[, mask]] )函数的理解参考文章在这里



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值