美文网首页图像处理
图片处理-opencv-11.图像采样、金字塔(向下取样、向上取

图片处理-opencv-11.图像采样、金字塔(向下取样、向上取

作者: lk311 | 来源:发表于2020-10-23 09:00 被阅读0次

    图像采样处理

    图像采样(Image Sampling)处理是将一幅连续图像在空间上分割成M×N个网格,每个网格用一个亮度值或灰度值来表示.

    图像采样的间隔越大,所得图像像素数越少,空间分辨率越低,图像质量越差,甚至出现马赛克效应;相反,图像采样的间隔越小,所得图像像素数越多,空间分辨率越高,图像质量越好,但数据量会相应的增大。

    import cv2  
    import numpy as np  
    import matplotlib.pyplot as plt
    
    #读取原始图像
    img = cv2.imread('data/test3.jpg')
    src = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
    #获取图像高度和宽度
    height = src.shape[0]
    width = src.shape[1]
    
    #采样转换成8*8区域
    numHeight = height//16
    numwidth = width//16
    
    #创建一幅图像
    new_img = np.zeros((height, width, 3), np.uint8)
    
    #图像循环采样16*16区域
    for i in range(16):
        #获取Y坐标
        y = i*numHeight
        for j in range(16):
            #获取X坐标
            x = j*numwidth
            #获取填充颜色 左上角像素点
            b = src[y, x][0]
            g = src[y, x][1]
            r = src[y, x][2]
            
            #循环设置小区域采样
            for n in range(numHeight):
                for m in range(numwidth):
                    new_img[y+n, x+m][0] = np.uint8(b)
                    new_img[y+n, x+m][1] = np.uint8(g)
                    new_img[y+n, x+m][2] = np.uint8(r)
    
    #显示图像
    titles = ['src', 'Sampling']
    images = [src, new_img]
    plt.figure(figsize=(10, 4))
    for i in range(2):
        plt.subplot(1, 2, i+1)
        plt.imshow(images[i], 'gray')
        plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
    plt.show()
    
    # 上述代码存在一个问题,当图像的长度和宽度不能被采样区域整除时,输出图像的最右边和最下边的区域没有被采样处理
    
    image.png

    图像金字塔

    图像金字塔是指由一组图像且不同分别率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。如图所示,它包括了四层图像,将这一层一层的图像比喻成金字塔。图像金字塔可以通过梯次向下采样获得,直到达到某个终止条件才停止采样,在向下采样中,层级越高,则图像越小,分辨率越低。

    image.png

    生成图像金字塔主要包括两种方式——向下取样、向上取样。在上图中,将图像G0转换为G1、G2、G3,图像分辨率不断降低的过程称为向下取样;将G3转换为G2、G1、G0,图像分辨率不断增大的过程称为向上取样。

    图像向下取样

    在图像向下取样中,使用最多的是高斯金字塔。它将对图像Gi进行高斯核卷积,并删除原图中所有的偶数行和列,最终缩小图像。其中,高斯核卷积运算就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值(权重不同)经过加权平均后得到。

    高斯核卷积让临近中心的像素点具有更高的重要度,对周围像素计算加权平均值.原始图像具有M×N个像素,进行向下取样之后,所得到的图像具有M/2×N/2个像素,只有原图的四分之一。通过对输入的原始图像不停迭代以上步骤就会得到整个金字塔。注意,由于每次向下取样会删除偶数行和列,所以它会不停地丢失图像的信息。

    dst = pyrDown(src[, dst[, dstsize[, borderType]]])

    • src表示输入图像,
    • dst表示输出图像,和输入图像具有一样的尺寸和类型
    • dstsize表示输出图像的大小,默认值为Size()
    • borderType表示像素外推方法
    import cv2  
    import numpy as np  
    import matplotlib.pyplot as plt
    
    #读取原始图像
    img = cv2.imread('data/test3.jpg')
    src = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
    #图像向下取样
    r = cv2.pyrDown(src)
    
    #显示图像
    titles = ['src', 'Sampling']
    images = [src, r]
    plt.figure(figsize=(10, 4))
    for i in range(2):
        plt.subplot(1, 2, i+1)
        plt.imshow(images[i], 'gray')
        plt.title(titles[i])
    #     plt.xticks([]), plt.yticks([])
    plt.show()
    
    image.png

    图像向上取样

    在图像向上取样是由小图像不断放图像的过程。它将图像在每个方向上扩大为原图像的2倍,新增的行和列均用0来填充,并使用与“向下取样”相同的卷积核乘以4,再与放大后的图像进行卷积运算,以获得“新增像素”的新值。

    dst = pyrUp(src[, dst[, dstsize[, borderType]]])

    • src表示输入图像,
    • dst表示输出图像,和输入图像具有一样的尺寸和类型
    • dstsize表示输出图像的大小,默认值为Size()
    • borderType表示像素外推方法
    import cv2  
    import numpy as np  
    import matplotlib.pyplot as plt
    
    #读取原始图像
    img = cv2.imread('data/test3.jpg')
    src = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
    #图像向上取样
    r = cv2.pyrUp(src)
    
    #显示图像
    titles = ['src', 'pyrUp']
    images = [src, r]
    plt.figure(figsize=(10, 4))
    for i in range(2):
        plt.subplot(1, 2, i+1)
        plt.imshow(images[i], 'gray')
        plt.title(titles[i])
    #     plt.xticks([]), plt.yticks([])
    plt.show()
    
    image.png

    相关文章

      网友评论

        本文标题:图片处理-opencv-11.图像采样、金字塔(向下取样、向上取

        本文链接:https://www.haomeiwen.com/subject/nzqvpktx.html