当前位置:   article > 正文

OpenCV简介、导入及图像处理基础方法讲解(图文解释 附源码)

opencv

需要源码和图片集请点赞关注收藏后评论区留言私信~~~

一、OpenCV简介

计算机视觉项目的开发中,OpenCV作为较大众的开源库,拥有了丰富的常用图像处理函数库,采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上,能够快速的实现一些图像处理和识别的任务

OpenCV还提供了Java、Python、cuda等的使用接口、机器学习的基础算法调用,从而使得图像处理和图像分析变得更加易于上手,让开发人员更多的精力花在算法的设计上

OpenCV的主要应用领域有计算机视觉领域方向、物体识别、图像分割、人脸识别、动作识别、运动跟踪等

二、Python中OpenCV的安装与导入

安装OpenCV的方式很简单,按常规的模块安装方法运行安装命令即可。安装命令和模块导入的常规格式如下

pip install opencv-python

import cv2 as cv

三、OpenCV图像处理基础

 cv2的基本方法与属性

OpenCV提供了大量图像处理相关的方法,常用方法及其说明如下图所示

下面打开图像并显示 然后输入esc退出 输入S时保存图像退出

 

代码如下

  1. import numpy as np
  2. import cv2 as cv
  3. from matplotlib import pyplot as plt
  4. img=cv.imread('D:\image\lena.jpg',cv.IMREAD_GRAYSCALE)
  5. cv.imshow('Lean',img)
  6. k = cv.waitKey(0)
  7. if k == 27: #等待按ESC键退出
  8. cv.destroyAllWindows()
  9. elif k == ord('s'): #等待按S键保存图片并退出
  10. cv.imwrite('D:\image\newLena.jpg',img)
  11. cv.destroyAllWindows()

 需要注意的是,通过OpenCV使用cv2.imread命令读取的彩色图像是BGR格式,如果有必要的话可以将其从BGR格式转换为RGB格式

image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)    

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

图像打开后,利用其shape和size显示图像对象的尺寸和大小

print(img.shape)

print(img.size)

在处理图像时,可以将一些文字利用putText方法直接输出到图像中

putText格式: cv2.putText(图片名,文字,坐标,字体,字体大小,文字颜色,字体粗细) 字体可以选择FONT_HERSHEY_SIMPLEX、FONT_HERSHEY_SIMPLEX、FONT_HERSHEY_PLAIN等

 

代码如下 

  1. import cv2 as cv
  2. img = cv.imread('D:\image\lena.jpg',cv.IMREAD_GRAYSCALE)
  3. cv.namedWindow('Hello,Lena', cv.WINDOW_AUTOSIZE)
  4. w,h=img.shape
  5. x = w // 3 # 文本的x坐标
  6. y = h // 3 # 文本的y坐标
  7. cv.putText(img,'Hello,Lena!',(x,y),cv.FONT_HERSHEY_SIMPLEX,0.8,(255,0,0),1)
  8. cv.imshow('Lean',img) #显示图像
  9. cv.waitKey(0)
  10. cv.destroyAllWindows()

 cv2图像处理示例

图像常用处理有图像缩放、旋转、仿射变换和二值化等

1. 图像缩放

实现缩放图片并保存,是使用OpenCV时常用的操作。cv2.resize()支持多种插值算法,默认使用cv2.INTER_LINEAR,缩小最适合使用:cv2.INTER_AREA,放大最适合使用:cv2.INTER_CUBIC或cv2.INTER_LINEAR

代码如下 

  1. import cv2 as cv
  2. import matplotlib.pyplot as plt
  3. img = cv.imread('images\lena.jpg',cv.COLOR_BGR2GRAY)
  4. width,height,channel = img.shape
  5. b,g,r = cv.split(img)
  6. src = cv.merge([r, g, b])
  7. res = cv.resize(src,(2*width,2*height),interpolation = cv.INTER_CUBIC)
  8. plt.subplot(121)
  9. plt.imshow(src)
  10. plt.axis('off')
  11. plt.subplot(122)
  12. plt.imshow(res)
  13. plt.axis('off')
  14. # cv.waitKey(0)
  15. # cv.destroyAllWindows()

 2.图像旋转

OpenCV中首先需要构造一个旋转矩阵,可以通过cv2.getRotationMatrix2D获得。getRotationMatrix2D格式:

M = cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6) 其中,第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子

结果如下

  1. img = cv.imread('images\lena.jpg',cv.IMREAD_COLOR)
  2. rows,cols,ch = img.shape
  3. b,g,r = cv.split(img)
  4. src = cv.merge([r, g, b])
  5. M = cv.getRotationMatrix2D((cols/2,rows/2),45,1)
  6. dst = cv.warpAffine(src,M,(cols,rows))
  7. plt.subplot(121)
  8. plt.imshow(src)
  9. plt.axis('off')
  10. plt.subplot(122)
  11. plt.imshow(dst)
  12. plt.axis('off')

 3.仿射变换

在仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建偏移矩阵,需要在原图像中找到三个点以及它们在输出图像中的位置。然后OpenCV中提供了cv2.getAffineTransform创建2*3的矩阵,最后将矩阵传给函数cv2.warpAffine

仿射变换结果如下

  1. import numpy as np
  2. img = cv.imread('images\lena.jpg',cv.COLOR_BGR2GRAY)
  3. rows,cols,ch = img.shape
  4. b,g,r = cv.split(img)
  5. img = cv.merge([r, g, b])
  6. pts1 = np.float32([[50,50],[200,50],[50,200]])
  7. pts2 = np.float32([[10,100],[200,50],[100,250]])
  8. M = cv.getAffineTransform(pts1,pts2)
  9. dst = cv.warpAffine(img,M,(cols,rows))
  10. plt.subplot(121)
  11. plt.imshow(img)
  12. plt.title('Input')
  13. plt.axis('off')
  14. plt.subplot(122)
  15. plt.imshow(dst)
  16. plt.title('Output')
  17. # plt.show()
  18. plt.axis('off')

 4.图像二值化

图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓

代码如下

  1. src = cv.imread('images\lena.jpg',cv.COLOR_BGR2GRAY)
  2. gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
  3. cv.imshow('input',gray)
  4. h, w = gray.shape[:2]
  5. m = np.reshape(gray, [1, w*h])#化为一维数组
  6. mean = m.sum() / (w*h)
  7. print("mean: ", mean)
  8. ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
  9. cv.imshow('Binary',binary)
  10. cv.waitKey(0)
  11. cv.destroyAllWindows()

上面的cv.Threshold实现对灰度图像进行阈值操作得到二值图像

创作不易 觉得有帮助请点赞关注收藏~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/259973
推荐阅读
相关标签
  

闽ICP备14008679号