【图像处理】——上采样、下采样、在模板匹配中的金字塔加速策略

    科技2024-01-17  67

    目录

    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级的高

    Processed: 0.014, SQL: 8