分享

OpenCV3入门教程(一)基础知识

 行走在理想边缘 2019-05-12

------韦访 20181011

1、概述

想学习图像处理,不管是机器学习也好,深度学习也好,不会点OpenCV好像有点说不过去吧?所以,现在开始OpenCV的学习。

2、读写图片

先从图片的读写开始,opencv读取图片的函数是imread,默认情况下,imread函数返回BGR格式的图像,可以用imwrite函数将数据写到本地。下面的代码会将JPG图片转成PNG。

  1. import cv2
  2. image = cv2.imread('dog.jpeg')
  3. cv2.imwrite('dog.png', image)

运行结果:

如果想将图片通过OpenCV的窗口显示,则调用imshow函数,注意在代码末尾加上waitkey函数,否则窗口就直接关闭了,不知道的还以为imshow函数没起作用。代码如下,

  1. import cv2
  2. image = cv2.imread('dog.jpeg')
  3. cv2.imwrite('dog.png', image)
  4. cv2.imshow('dog', image)
  5. cv2.waitKey(0)

运行结果:

上面提到,imread默认返回的是BGR图片,我们也可以通过设置参数,让其返回一个灰度图片,代码如下,

  1. import cv2
  2. image = cv2.imread('dog.jpeg', flags=cv2.IMREAD_GRAYSCALE)
  3. cv2.imshow('dog', image)
  4. cv2.waitKey(0)

运行结果:

3、高通滤波器

高通滤波器(HPF)是检测图像的某个区域,根据该像素与周围像素的亮度差值来提升该像素的亮度的滤波器。下面来举个例子,代码如下,

  1. import cv2
  2. import numpy as np
  3. from scipy import ndimage

  4. kernel_3x3 = np.array([
  5. [-1, -1, -1],
  6. [-1, 8, -1],
  7. [-1, -1, -1],
  8. ])

  9. kernel_5x5 = np.array([
  10. [-1, -1, -1, -1, -1],
  11. [-1, -1, 2, -1, -1],
  12. [-1, 2, 4, 2, -1],
  13. [-1, -1, 2, -1, -1],
  14. [-1, -1, -1, -1, -1],
  15. ])

  16. img = cv2.imread('sea.jpg', flags=cv2.IMREAD_GRAYSCALE)
  17. k3 = ndimage.convolve(img, kernel_3x3)
  18. k5 = ndimage.convolve(img, kernel_5x5)

  19. GBlur = cv2.GaussianBlur(img, (11, 11), 0)
  20. g_hpf = img - GBlur

  21. cv2.imshow('img', img)
  22. cv2.imshow('3x3', k3)
  23. cv2.imshow('5x5', k5)
  24. cv2.imshow('g_hpf', g_hpf)
  25. cv2.waitKey()
  26. cv2.destroyAllWindows()

4、低通滤波器

低通滤波器则在像素与周围像素的亮度差值小于一个特定值时,平滑该像素的亮度,主要用于去噪和模糊化。

 

5、边缘检测

边缘检测不管是在人类视觉还是计算机视觉中都是非常重要的,我们能识别物体,就是靠边缘。这个很容易理解,夜晚很黑什么都看不到,不就是因为没看到物体的边缘吗?

OpenCV提供了很多边缘检测的滤波函数,比如,Laplacian, Sobel, Scharr, Canny等。这些函数会将非边缘区域转为黑色,将边缘区域转为白色或其他颜色。但是,这些函数容易将噪声错误的失败为边缘,所以,在边缘检测之前,应该对图像进行模糊处理。

OpenCV提供了很多模糊滤波器,比如blur, medianBlur, GausianBlur等,边缘检测滤波器和模糊滤波器总有一个ksize参数,这个参数表示滤波核的宽高,是一个奇数。还是来个代码吧,

  1. import cv2

  2. img = cv2.imread('car.jpg', flags=cv2.IMREAD_GRAYSCALE)
  3. GBlur = cv2.GaussianBlur(img, (3, 3), 0)
  4. canny = cv2.Canny(GBlur, 50, 150)
  5. cv2.imshow('img', img)
  6. cv2.imshow('canny', canny)
  7. cv2.waitKey(0)
  8. cv2.destroyAllWindows()

运行结果,

6、边界框、最小矩形区域、最小闭圆的轮廓

实际应用中经常会对目标的边界框、最小矩形区域、最小闭圆特别感兴趣。用cv2.findContours函数很容易实现上述功能。上代码,

  1. #encoding:utf-8
  2. import cv2
  3. import numpy as np

  4. #读取图片
  5. img = cv2.imread('Picture1.png', cv2.IMREAD_UNCHANGED)
  6. #降低分辨率,也可以不降低
  7. # img = cv2.pyrDown(img)

  8. #对图像进行二值化操作
  9. ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY), 127, 255, cv2.THRESH_BINARY)

  10. #检测轮廓,
  11. #输入的三个参数分别为:输入图像、层次类型、轮廓逼近方法
  12. #因为这个函数会修改输入图像,所以上面的步骤使用copy函数将原图像做一份拷贝,再处理
  13. #返回的三个返回值分别为:修改后的图像、图轮廓、层次
  14. image, contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

  15. for c in contours:
  16. #边界框
  17. x, y, w, h = cv2.boundingRect(c)
  18. cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

  19. #最小矩形区域
  20. rect = cv2.minAreaRect(c)
  21. box = cv2.boxPoints(rect)
  22. box = np.int0(box)
  23. cv2.drawContours(img, [box], 0, (0, 0, 255), 3)

  24. #最小闭圆
  25. (x, y), radius = cv2.minEnclosingCircle(c)
  26. center = (int(x), int(y))
  27. radius = int(radius)
  28. img = cv2.circle(img, center, radius, (255, 0, 0), 2)

  29. cv2.imshow('image', image)
  30. cv2.drawContours(img, contours, -1, (255, 0, 0), 1)
  31. cv2.imshow("contours", img)
  32. cv2.waitKey(0)

运行结果:

总结:

基础知识先学这么多,后续再通过实例慢慢学,本来想加上摄像头的操作,无奈电脑没有摄像头,已经在淘宝了,后续实例中再补了。

 

 

如果您感觉本篇博客对您有帮助,请打开支付宝,领个红包支持一下,祝您扫到99元,谢谢~~

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多