A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

内容来自OpenCV-Python Tutorials 自己翻译整理

目标
图像加法、减法、位运算
学习函数cv2.add(),cv2.addWeighted()

加法:
使用cv2.add()将两个图像相加,可以使用numpy中的矩阵加法来实现。但是在opencv中加法是饱和操作,也就是有上限值,numpy会对结果取模。
综上,使用opencv的效果更好

img1=cv2.imread('1.jpg')
img2=cv2.imread('2.jpg')

res = cv2.add(img1,img2)

原图像


加法后的结果

图像混合
实际上也是加法,只不过是按比例混合起来,有不同的权重
公式如下
g (x) = (1 − α)f0 (x) + αf1 (x)

现在第一幅图像的权重是0.7,第二幅图像的权重是0.3,使用cv2.addWeighted()函数进行混合

img1=cv2.imread('1.jpg')

img2=cv2.imread('2.jpg')


dst=cv2.addWeighted(img1,0.7,img2,0.3,0)

混合后的结果

按位运算

位运算操作有and, or, not, xor。在提取部分图像选择非举行区域roi时,位运算操作十分有用。下面例子是改变一副图像的特定区域。
把opencv的标志放到另外一副图像上,如果使用加法,颜色会改变,如果使用混合,会变成透明,但是我们不想要透明效果,如果是举行区域,可以使用roi方法,但是并不是举行,下面使用位运算实现。

import cv2

import numpy as np

# 加载图像

img1 = cv2.imread('2.jpg')

img2 = cv2.imread('1.jpg')


rows,cols,channels = img2.shape

roi = img1[0:rows, 0:cols ]


img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)

ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)#ret是阈值(175)mask是二值化图像

mask_inv = cv2.bitwise_not(mask)#获取把logo的区域取反


img1_bg = cv2.bitwise_and(roi,roi,mask = mask)#在img1上面,将logo区域和mask取与使值为0


# 取 roi 中与 mask_inv 中不为零的值对应的像素的值,其他值为 0 。

# 把logo放到图片当中

img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)#获取logo的像素信息


dst = cv2.add(img1_bg,img2_fg)#相加即可

img1[0:rows, 0:cols ] = dst

cv2.imshow('res',img2_fg)

cv2.waitKey(0)

cv2.destroyAllWindows()

样例里面的思路比较巧妙,logo的背景都是黑色的,方便提取出来
先将logo设定阈值并二值化,得到logo区域的范围
将在背景图片中要放置logo区域的像素信息用位运算置0
将logo的像素信息和背景图片的像素相加
最后就这这个效果

练习
制作一个类似幻灯片似的的图片平滑过渡到另外一张图片(类似凤姐变成刘亦菲)

import cv2

import numpy as np


def nothing(x):

    pass


img1 = cv2.imread('1.jpg')

img2 = cv2.imread('2.jpg')

# 创建一个黑色背景的窗口

img = np.zeros((500,500,3), np.uint8)

cv2.namedWindow('image')


cv2.createTrackbar('a','image',0,100,nothing)



while(1):

    cv2.imshow('image',img)

    k = cv2.waitKey(1) & 0xFF

    if k == 27:

        break


    r = cv2.getTrackbarPos('a','image')

    r=float(r)/100.0


    img=cv2.addWeighted(img1,r,img2,1.0-r,0)


cv2.destroyAllWindows()

可怕~


5 个回复

正序浏览
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
优秀,奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马