实例1(扩充边界)
import cv2
import numpy as np
import pylab
from matplotlib import pyplot as plt
pylab.rcParams['figure.figsize'] = (25.0, 12.0) # 显示大小
Blue=[0,0,255]
img=cv2.imread('rectAndPolylines.jpg')
b,g,r=cv2.split(img)
img=cv2.merge([r,g,b])
#不同的扩充方法
replicate=cv2.copyMakeBorder(img,30,10,10,30,cv2.BORDER_REPLICATE)
reflect=cv2.copyMakeBorder(img,30,10,10,30,cv2.BORDER_REFLECT)
reflect101=cv2.copyMakeBorder(img,30,10,10,30,cv2.BORDER_REFLECT_101)
wrap=cv2.copyMakeBorder(img,30,10,10,30,cv2.BORDER_WRAP)
constant=cv2.copyMakeBorder(img,30,10,10,30,cv2.BORDER_CONSTANT,value=Blue)
plt.subplot(231),plt.imshow(img,'gray'),plt.title('Original')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('Replicate')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('Reflect')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('Reflect101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('Wrap')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('Constant')
plt.xticks([]),plt.yticks([])
plt.show()
可以明显看出各种方法的不同之处,Reflect的两种方法效果非常接近,只是在边缘细节的地方不一样,可以根据实际的效果来选择,而wrap则与前者不一样,尤其在边界的效果上,如果需要做到无缝的扩充则是reflect效果好。常数的扩充则在卷积过程中用的较为广泛。reflect和wrap可以做出很漂亮的印花图案(下图)。
实例2(openCV与Numpy的图像加法)
在前面的知识简介中已经作了描述,这里就直接附上效果图。
#区域加法
img1=240*np.ones((50,50,3),np.uint8)
img2=60*np.ones((50,50,3),np.uint8)
addValue=100#可以加上一个常数
#利用opencv的add函数
imgCVAdd=cv2.add(img1,img2)
#直接像素矩阵相加numpy
imgNumpyAdd=img1+img2
imgConstantAdd=cv2.add(img1,addValue)
imgConstantNumpyAdd=img1+addValue
OpenCV的加法在图像领域还是要用的广泛,知道这种加法做起来会简便很多。
实例3 做一个可以调节权重的图像混合GUI
通过调节滑动条,我们可以实时控制两张图所占的比例,实现过程如下:
#读取图片
img1=cv2.imread('bob.png')
img2=cv2.imread('edithFinch2.jpg')
#可以在创建滑动条时做的事情,此处没想到可以做什么特别的,可以初始化一些数据
def doNothing(x):
pass
cv2.namedWindow('AddPictures')
cv2.createTrackbar("weight(%)",'AddPictures',30,100,doNothing)#创建滑动条来控制权重
while(1):
weight=cv2.getTrackbarPos("weight(%)",'AddPictures')
#图像融合,根据比例来确定两张图片所占比重
dstImage=cv2.addWeighted(img1,0.01*weight,img2,0.01*(100-weight),0)#两张图像的大小得一致
cv2.imshow('AddPictures',dstImage)
if cv2.waitKey(10) & 0xFF==ord('q'):#按下q,退出程序
break
cv2.destroyAllWindows()
参考文献:OpenCV官方教程中文版for python