• 【opencv图像处理】-- 7. 图像金字塔与直方图


    希望有能力的朋友还是拿C++做。

    本节讨论金字塔(高斯金字塔和拉普拉斯金字塔)以及统计图像直方图

    1. 图像金字塔

    • 是图像多尺度表达的一种,最主要用于图像分割。是同一图像不同分辨率的子集合。
    • 是一系列以金字塔形状排列的分辨率逐步降低同一张图像的集合。
    • 其通过梯次向下采样获得,直到某个终止条件停下
    • 顶部是高分辨率表示,顶部是低分辨率表示,将一层一层比成金字塔,越靠近顶部,图像越小,分辨率越低
    • 不同于resize的是,需要保留原图1/4的缩放

    1.1 高斯金字塔

    Gaussian pyramid:用来降采样,主要的图像金字塔

    1.1.1向下采样,由大变小

    • 亚采样(subsamping) 采集完之后图变小了 例原有100点 采集10个点
    • 原理十分简单, 进行了卷积操作:
      • 提前准备一高斯卷积核,将Gi与高斯内核卷积
      • 将所有偶数的行和列去掉 就变为1/4了
      • 不用指定尺寸 固定缩为每次1/4
    • 降维
    #向下采样
    import cv2
    import numpy as np
    
    img = cv2.imread('cat.jpeg')
    print(img.shape)
    
    #分辨率减小的操作,下采样,只需一个参数,每次固定1/4
    dst = cv2.pyrDown(img)
    print(dst.shape)
    
    cv2.imshow('img', img)
    cv2.imshow('dst', dst)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    1.1.2 向上采样,由小变大

    逆亚采样

    • 将图像在每个方向扩大为原来的两倍,新增的行和列先以0填充
    • 然后使用先前同样的卷积核(X4)与放大后的图像卷积,获得近似值
    • 将原值分配到临近四个为0的邻域,但是图像会变暗,所以乘以4
    # 向上采样
    import cv2
    import numpy as np
    
    img = cv2.imread('cat.jpeg')
    print(img.shape)
    
    #分辨率增大的操作,下采样,只需一个参数,每次固定4倍
    dst = cv2.pyrUp(img)
    print(dst.shape)
    
    cv2.imshow('img', img)
    cv2.imshow('dst', dst)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    1.2 拉普拉斯金字塔

    Laplacian pyramid:用于从金字塔底层图像重建上层未采样图像(实际上是原图和高斯金字塔之间的残差,丢到的东西就是拉普拉斯金字塔),在数字图像处理中即为预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用

    • 将降采样之后的图像进行上采样才做,然后与还没降采样的图像做差,得到残差图,为还原图像左信息准备
    • 拉普拉斯金字塔只像图像边缘, 大部分图像都是0,用于图像压缩
    • 由高斯金字塔构成 没有特殊的函数
    import cv2
    import numpy as np
    
    img = cv2.imread('cat.jpeg')
    print(img.shape)
    
    
    # 这是第0层 的
    #先缩小
    dst = cv2.pyrDown(img)
    #再放大
    dst = cv2.pyrUp(dst)
    # Laplace = 原图 - dst
    lap0 = img - dst
    
    #这是第一层的
    dst1 = cv2.pyrDown(dst)
    dst1 = cv2.pyrUp(dst1)
    lap1 = dst - dst1
    
    cv2.imshow('img', img)
    cv2.imshow('dst0', lap0)
    cv2.imshow('dst1', lap1)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    #高斯金字塔取样不可逆
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    2. 图像直方图

    二维统计图表, 可以均衡亮度等

    • 横坐标:图像中各像素点的灰度级
    • 纵坐标:具有该灰度级的像素个数
    • 直方图术语:
      • dims:需要统计的特征数目, 。例如:dims=1,仅统计灰度值
      • bins:每个特征空间子区段的数目(横坐标分段数),一般的bins不缩的话一般是255,详见bins.png
      • range:统计灰度的范围,一般是[0,255]

    2.1 统计直方图

    • calcHist(image, channels, mask, histSize, ranges[, hist[, accumulate[]]])
      • image: 原始图像
      • channels:指定通道
        • 中括号括起来,[0]:灰度图,[0],[1],[2]可以作为彩图参数,对应B,G,R
      • mask:掩码图像
        • None:统计整幅图
        • 统计图像某一部分时,就需要掩码图像
      • histSize: BINS的数量
        • 例如[256],表示256个段
      • ranges: 像素值范围,例如[0,255]
      • accumulate:累积标识
        • 默认false
        • True:直方图开始分配时不会清零
        • 该参数允许从多个图像中计算单个直方图,或用于实时更新直方图
        • 多个直方图的累计结果,用于对一组图像计算直方图
    import cv2
    import numpy as np
    
    img = cv2.imread('cat.jpeg')
    
    hist = cv2.calcHist([img], [0], None, [256], [0,255])
    print(hist)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.2 绘制直方图

    2.2.1 不用opencv的统计方法

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    img = cv2.imread('cat.jpeg')
    
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    plt.hist(gray.ravel(), bins=256, range=[0,255])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.2.2 用opencv统计方法

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    img = cv2.imread('cat.jpeg')
    
    histb = cv2.calcHist([img], [0], None, [256], [0,255])
    histg = cv2.calcHist([img], [1], None, [256], [0,255])
    histr = cv2.calcHist([img], [2], None, [256], [0,255])
    
    #plot不传x的时候,会以histb的索引作为x
    plt.plot(histb, color='b', label='blue')
    plt.plot(histg, color='g', label='green')
    plt.plot(histr, color='r', label='red')
    plt.legend()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.3 使用掩膜的直方图

    • 生成和原图一样尺寸的全黑图片,mask=np.zeros(image.shape, np.uint8)
    • 将想要的区域通过索引的方式设置为纯白255,mask[100:200, 200:300]=255
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    img = cv2.imread('cat.jpeg')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    #生成掩膜图像
    mask = np.zeros(gray.shape, np.uint8)
    
    #设置想要统计的直方图区域
    mask[200:400, 200:400] = 255
    
    
    cv2.imshow('mask', mask)
    cv2.imshow('gray', gray)
    #gray,再和mask做与运算
    #cv2.imshow('mask_gray', cv2.bitwise_and(gray, gray, mask=mask))
    cv2.imshow('mask_gray', cv2.bitwise_and(gray, mask))
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    golang中的Mutex原理解析
    linux配置文件共享
    Java版本+企业电子招投标系统源代码+支持二开+招投标系统+中小型企业采购供应商招投标平台
    微服务组件--注册中心Spring Cloud Eureka分析
    呕血解决:PicGo + GitHub + Typora 搭建个人图床工具
    导入excel工具类
    VR太空舱体验馆VR神舟返回舱VR虚拟现实科技科普乐园
    信息系统项目管理师第四版:第5章 信息系统工程
    可以群发消息的微信营销软件
    JSONObject的底层原理&&常见方法的使用以及项目中的使用场景
  • 原文地址:https://blog.csdn.net/Eric_Sober/article/details/126054582