目录
1、下采样
Python自带函数
自定义函数
Python实现下采样
2、上采样
Python自带函数
自定义函数
Python实现
3、金字塔加速策略
金字塔加速模板匹配具体步骤:
具体可参考:https://blog.csdn.net/Eastmount/article/details/89341077
本文补充了用Python自定义函数来实现下采样和上采样
1、下采样
Python自带函数
dst = pyrDown(src[, dst[, dstsize[, borderType]]])
src表示输入图像,dst表示输出图像,和输入图像具有一样的尺寸和类型dstsize表示输出图像的大小,默认值为Size()borderType表示像素外推方法,详见cv::bordertype
自定义函数
首先高斯模糊
再将偶数行和列的像素格删除
为了防止删除后邻近像素相差较大,一般需要对下采样后的图像进行2*2的均值平滑操作
Python实现下采样
import cv2
import numpy as np
img = cv2.imread('pic1.jpg',0)
#自定义
def defImgDownM(img):
h,w = img.shape
#定义下采样输出图像大小
if h%2 == 0:
h = int(h/2)#这里是因为除法得到的是2.0,而创建新图像时的行列数必须是整数
else:
h = int(h/2) + 1#若为偶数行数则直接一半像素,否则就是向下取整再加1
if w%2 == 0:
w = int(w/2)
else:
w = int(w/2) + 1#若为偶数列数则直接一半像素,否则就是向下取整再加1
imgDown = np.zeros((h,w),np.uint8)
#定义高斯卷积核
kernalDown = np.array([[1/16,2/16,1/16],[2/16,4/16,2/16],[1/16,2/16,1/16]])
#1、进行高斯模糊
img1 = cv2.filter2D(img, -1, kernalDown)#-1表示和原图像深度一样,也就是大小和比特都和原图像一样
#2、删除偶数列和行
for i in range(h):
for j in range(w):
imgDown[i,j] = img1[2*i,2*j]
#3、均值平滑
krenal = np.array([[1/4,1/4],[1/4,1/4]])
imgDown = cv2.filter2D(imgDown, -1, krenal)
cv2.namedWindow('defImgDown',0)
cv2.namedWindow('1',0)
cv2.imshow('1',img)
cv2.imshow('defImgDown',imgDown)
cv2.waitKey(0)
#
def sysImgDown(img):
imgdown = cv2.pyrDown(img)
cv2.namedWindow('sysImgDown',0)
cv2.imshow('sysImgDown',imgdown)
cv2.waitKey(0)
if __name__ == '__main__':
defImgDownM(img)
sysImgDown(img)
2、上采样
Python自带函数
dst = pyrUp(src[, dst[, dstsize[, borderType]]])
src表示输入图像,dst表示输出图像,和输入图像具有一样的尺寸和类型dstsize表示输出图像的大小,默认值为Size()borderType表示像素外推方法,详见cv::bordertypes
自定义函数
(1)定义输出图像,扩大成原来的2倍
(2)将原先的像素依次复制给新图像的偶数列
(3)利用4倍的高斯核进行卷积
(4)得到的就是上采样的图像了
Python实现
import cv2
import numpy as np
img = cv2.imread('pic1.jpg',0)
h,w = img.shape
#1、定义新图像大小
img1 = np.zeros((2*h,2*w),np.uint8)
#定义4倍的高斯核
kernal = np.array([[4/16,8/16,4/16],[8/16,16/16,8/16],[4/16,8/16,4/16]])
for i in range(h):
for j in range(w):
img1[2*i,2*j] = img[i,j]
#卷积
img1 = cv2.filter2D(img1, -1, kernal)
#Python自带的函数
img2 = cv2.pyrUp(img)
# ##下面是进行多次下采样
# img11 = img1.copy()
# for i in range(6):
# img11 = cv2.pyrDown(img11)
# print(img11.shape)
cv2.namedWindow('1',0)
cv2.namedWindow('2',0)
cv2.imshow('1',img1)
cv2.imshow('2',img11)
cv2.waitKey(0)
3、金字塔加速策略
这个策略主要用在模板匹配上,先将模板和图像以相同的层数进行下采样,得到匹配点后再进行上采样返回到第0层得到第0层时的坐标
金字塔加速模板匹配具体步骤:
1、先获得同层级的模板和原图像下采样图像;
2、用高层的模板匹配同一层级的待测图像(假设3层,0,1,2,3)
3、根据2可以得到匹配点(x3,y3),设这个点为匹配区域的左上角点
4、将其向上一层级返回(x2,y2)= (2x3,2y3)
...
5、如此循环,返回到第0层即源图像,(x0,y0)=(2^nxn,2^nyn)
6、得到角点后就能够绘制出ROI区域,左上角点(x0,y0),右下角点(x0',y0')= (x0+x0_template,y0+y0_template),其中x0_template是模板第0级的高