参考文献

目标

  • 学习图像金字塔
  • 学习函数cv2.pyrUp()和cv2.pyrDown()

原理

当我们需要将图像转换到另一个尺寸的时候, 有两种可能,一种是放大图像,另一种是缩小图像。尽管在Opencv几何变换中学到了resize()函数,不过使用图像金字塔来做图像缩放也是视觉运用中广泛应用的一项技术。

一般来说我们操作的图像是具有固定分辨率的,但是有些情况下,我们需要对同一图像的不同分辨率的子图像进行处理(尤其是在我们需要提取图像特征的时候)。这个时候我们需要创建一组新的图像,这些图像是具有不同分辨率的原始图像,那么我们把这组图像讲成图像金字塔。我们把最大的图像放在底部,最小的放在底部,看起来就像金字塔。如下所示:

图像金字塔

图像金字塔主要涉及两个函数:cv2.pyrUp()(图像尺寸变大,但分辨率不会增加),cv2.pyrDown()(图像尺寸变小,分辨率减少)

图像金字塔有两类类型:高斯金字塔和拉普拉斯金字塔。

高斯金字塔的顶部是通过将底部图像的连续行与列去掉得到的。每一层图像中的像素值等于下一层图像中对应位置5个像素的高斯加权平均值。这样操作一个M*N的图像就变成了(M/2)*(N/2)的图像,图像的面积就变为原来的1/4,连续进行这样的操作,就会得到一些列的金字塔的图像。如果是将图像变大,首先需要将图像在每个方向扩大为原来的两倍,新增的行和列以0填充,随后使用先前同样的内核(乘以4)与放大后的图像卷积,获得 “新增像素” 的近似值。Opencv中可以通过函数cv2.pyrDown()和cv2.pyrUp()来构建金字塔。

函数说明

函数cv2.pyrDown()可以将一个高分辨率图像变成低分辨率图像,其接受3个参数:

  • 要处理的图像src
  • 输出图像dst
  • 输出图像大小

默认情况下,只需要一个src参数即可,他会把图像按缩小1/4的来处理。cv2.pyrUp()函数的参数也是如此。下面是函数cv2.pyrDown()的使用。

# coding=utf-8
import cv2 img = cv2.imread("/home/wl/3.jpg", 1)
dst = cv2.pyrDown(img) while(1):
cv2.imshow("Result",dst)
cv2.imwrite("/home/wl/baocun.jpg",dst)
k = cv2.waitKey(1) & 0XFF
if k==ord('q'):
break;
cv2.destroyAllWindows()

原始图:

效果图:

cv2.pyrUp()函数与cv2.pyrDown()函数的功能相反,把金字塔上层的图像变到下一层来,也就是图像变大,但是有一点要注意的是,虽然变大了,但是图像并不能恢复成以前的样子,也就是分辨率上不能达到以前的那种效果。

将上面代码第六行修改为:

dst = cv2.pyrUp(res)

效果图:

图像的拉普拉斯金字塔可以由图像的高斯金字塔得到,转换的公式为:

拉普拉斯金字塔的图像看起来就像是边界图,其中很多像素都是0,经常被用在图像压缩中。

# coding=utf-8
import cv2 img = cv2.imread("/home/wl/3.jpg", 0)
img1 = cv2.pyrDown(img) #高斯金字塔
temp_img1 = cv2.pyrUp(img1)
img2 = cv2.pyrDown(temp_img1)
dst = img1 - img2 #拉普拉斯金字塔
cv2.imwrite("/home/wl/baocun.jpg",dst)
while(1):
cv2.imshow("Result1",img1)
cv2.imshow("Result2",dst)
cv2.imwrite("/home/wl/baocun.jpg",img1)
cv2.imwrite("/home/wl/baocun1.jpg", dst)
k = cv2.waitKey(1) & 0XFF
if k==ord('q'):
break;
cv2.destroyAllWindows()

效果图:


高斯金字塔处理结果


拉普拉斯金字塔处理结果

最新文章

  1. 【原创】web端高德地图javascript API的调用
  2. [BZOJ1501][NOI2005] 智慧珠游戏
  3. javax.el.PropertyNotFoundException: 异常处理
  4. google bookmarket api
  5. AsyncTask实现多线程断点续传
  6. javascript限制上传文件大小
  7. J2EE 第二阶段项目(八)
  8. SQL SERVER 组内排序
  9. codeforces 675D D. Tree Construction(线段树+BTS)
  10. NOIP算法总结
  11. 做一个牛XX的身份证号验证类(支持15位和18位)
  12. hdu_1907:John(Nim变形)
  13. 爬起点小说 day01
  14. 通过scrollTop,使子元素滚动至指定位置
  15. QT中pro文件编写的详细说明
  16. Linux 修改本地时间 (centos为例)
  17. Adnroid开发环境搭建(四步搞定)
  18. Spark基础-scala学习(七、类型参数)
  19. Mybatis报错 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'parentCode' not found. Available parameters are [0, 1, param1, param2]
  20. [poj1275][Cashier Employment]

热门文章

  1. 66.Python中startswith和endswith的使用
  2. Citrix 更新Vcenter 地址
  3. iOS基础——通过案例学知识之xib、plist、mvc
  4. python函数-函数进阶
  5. 19 01 04 CSS3 圆角 grba(带通明的) tansition动画 transform变换 animation动画
  6. js 动态添加元素 删除元素逻辑
  7. BZOJ 3197 [Sdoi2013]assassin
  8. CTF -攻防世界-crypto新手区(1~4)
  9. php中const和define的区别
  10. STM32F407读编码器没上拉电阻遇见的问题