OpenCV-008:抠图与图片拼接

来源:互联网 发布:淘宝导航条隐藏 编辑:程序博客网 时间:2024/06/05 05:30

使用的图片如下:




结果如下:



代码如下:

#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 cv2import numpy as np###############################################Global Parameter                   ##### Load two imagesimg1 = 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_maskprint 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 ] = dstcv2.imshow('res',img1)cv2.waitKey(0)cv2.destroyAllWindows()


原创粉丝点击