OpenCV-008:抠图与图片拼接

使用的图片如下:




结果如下:



代码如下:

#https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_core/py_image_arithmetics/py_image_arithmetics.html#image-arithmetics
# -- coding: utf-8 --
#如若程序有中文注释,将上行代码加到代码的第一行或第二行
#OpenCV-008:抠图与图片叠加
###########################################
####Import Module                      ####
import cv2
import numpy as np
###########################################
####Global Parameter                   ####
# Load two images
img1 = cv2.imread('D:\\Data\\016_ComputerVision\\img\\messi5.jpg')
img2 = cv2.imread('D:\\Data\\016_ComputerVision\\img\\opencv_logo.jpg')
###########################################
####Main Function                      ###
#获取图片的行数与列数
rows,cols,channels = img2.shape
#从已有图片中,剪切出一个指定大小的图像
roi = img1[0:rows, 0:cols ]
cv2.imshow('roi',roi)
cv2.waitKey(1000)
#将彩色图转换成灰度图
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
cv2.imshow('img2gray',img2gray)
cv2.waitKey(1000)
#下行为转换成黑白二值图像,具体参见http://blog.csdn.net/on2way/article/details/46812121
#cv2.threshold(src,thresh,maxval,type)->retval,dst 
#作用:用于获取二元值的灰度图像 
#thresh:阈值,它表示如果这个点的灰度大于(有时是小于)阈值,则将这个点的灰度修改成maxVal
#返回值retval就是阈值 ,dst就是图像
#阈值设置为220的根据是OPenCV-007读取了该图像的直方图,像素点呈现四峰分布,白色为255,其余小于220
#像素值小于220的,均被赋值为0(即黑色),其余被赋值为纯白色(值为255)
ret, logo_mask = cv2.threshold(img2gray,220, 255, cv2.THRESH_BINARY)
#下行被注释,因为cv2.THRESH_OTSU只适用于像素点直方图呈双峰分布的图像
#ret, logo_mask = cv2.threshold(img2gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
#打印出设置的阈值
print logo_mask
print ret
#显示阈值比较后的图片
cv2.imshow('logo_mask',logo_mask)
cv2.waitKey(1000)
#黑白色互为取反
logo_mask_inv = cv2.bitwise_not(logo_mask)
cv2.imshow('logo_mask_inv',logo_mask_inv)
cv2.waitKey(1000)
#关闭所有窗体
cv2.destroyAllWindows()
#https://docs.opencv.org/2.4.11/modules/core/doc/operations_on_arrays.html?highlight=bitwise#cv2.bitwise_and
#cv2.bitwise_and(src1, src2[, dst[, mask]]) → dst
#Parameters:	
#src1 – first input array or a scalar.
#src2 – second input array or a scalar.
#dst – output array that has the same size and type as the input arrays.
#mask – optional operation mask, 8-bit single channel array, that specifies elements of the output array to be changed.
#将ROI叠加到logo_mask_inv上
#bitwise_and:if mask(I)!=0,dst(I)=src1(I)∧ src2(I)
#白色值为255,黑色值为0
#https://www.zybang.com/question/3b82f45994381b8079a82d84445a6209.html
#“∧”是且的意思,相当于集合中的交集,“∨”是或的意思,相当于集合中的并集
#下式为mask值为黑色的,黑色部分不变,白色部分被改变成roi的部分 
img1_bg = cv2.bitwise_and(roi,roi,mask = logo_mask)
cv2.imshow('img1_bg',img1_bg)
cv2.waitKey(0)
#bitwise_or(src1, src2[, dst[, mask]]) → dst
#bitwise_or:if mask(I)!=0,dst(I)=src1(I)∨ src2(I)
#下式为mask值为黑色的,黑色部分不变,白色部分被改变成img2的部分
img2_fg = cv2.bitwise_or(img2,img2,mask = logo_mask_inv)
cv2.imshow('img2_fg',img2_fg)
cv2.waitKey(0)
#两个图像简单叠加,一个白底被处理过,一个红绿蓝色圈被处理过
dst = cv2.add(img1_bg,img2_fg)
cv2.imshow('dst',dst)
cv2.waitKey(0)
#dst覆盖原图像
img1[0:rows, 0:cols ] = dst
cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值