需要源码和图片集请点赞关注收藏后评论区留言私信~~~
一、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时保存图像退出
代码如下
import numpy as np import cv2 as cv from matplotlib import pyplot as plt img=cv.imread('D:\image\lena.jpg',cv.IMREAD_GRAYSCALE) cv.imshow('Lean',img) k = cv.waitKey(0) if k == 27: #等待按ESC键退出 cv.destroyAllWindows() elif k == ord('s'): #等待按S键保存图片并退出 cv.imwrite('D:\image\newLena.jpg',img) 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等
代码如下
import cv2 as cv img = cv.imread('D:\image\lena.jpg',cv.IMREAD_GRAYSCALE) cv.namedWindow('Hello,Lena', cv.WINDOW_AUTOSIZE) w,h=img.shape x = w // 3 # 文本的x坐标 y = h // 3 # 文本的y坐标 cv.putText(img,'Hello,Lena!',(x,y),cv.FONT_HERSHEY_SIMPLEX,0.8,(255,0,0),1) cv.imshow('Lean',img) #显示图像 cv.waitKey(0) cv.destroyAllWindows()
cv2图像处理示例
图像常用处理有图像缩放、旋转、仿射变换和二值化等
1. 图像缩放
实现缩放图片并保存,是使用OpenCV时常用的操作。cv2.resize()支持多种插值算法,默认使用cv2.INTER_LINEAR,缩小最适合使用:cv2.INTER_AREA,放大最适合使用:cv2.INTER_CUBIC或cv2.INTER_LINEAR
代码如下
import cv2 as cv import matplotlib.pyplot as plt img = cv.imread('images\lena.jpg',cv.COLOR_BGR2GRAY) width,height,channel = img.shape b,g,r = cv.split(img) src = cv.merge([r, g, b]) res = cv.resize(src,(2*width,2*height),interpolation = cv.INTER_CUBIC) plt.subplot(121) plt.imshow(src) plt.axis('off') plt.subplot(122) plt.imshow(res) plt.axis('off') # cv.waitKey(0) # cv.destroyAllWindows()
2.图像旋转
OpenCV中首先需要构造一个旋转矩阵,可以通过cv2.getRotationMatrix2D获得。getRotationMatrix2D格式:
M = cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6) 其中,第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
结果如下
img = cv.imread('images\lena.jpg',cv.IMREAD_COLOR) rows,cols,ch = img.shape b,g,r = cv.split(img) src = cv.merge([r, g, b]) M = cv.getRotationMatrix2D((cols/2,rows/2),45,1) dst = cv.warpAffine(src,M,(cols,rows)) plt.subplot(121) plt.imshow(src) plt.axis('off') plt.subplot(122) plt.imshow(dst) plt.axis('off')
3.仿射变换
在仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建偏移矩阵,需要在原图像中找到三个点以及它们在输出图像中的位置。然后OpenCV中提供了cv2.getAffineTransform创建2*3的矩阵,最后将矩阵传给函数cv2.warpAffine
仿射变换结果如下
import numpy as np img = cv.imread('images\lena.jpg',cv.COLOR_BGR2GRAY) rows,cols,ch = img.shape b,g,r = cv.split(img) img = cv.merge([r, g, b]) pts1 = np.float32([[50,50],[200,50],[50,200]]) pts2 = np.float32([[10,100],[200,50],[100,250]]) M = cv.getAffineTransform(pts1,pts2) dst = cv.warpAffine(img,M,(cols,rows)) plt.subplot(121) plt.imshow(img) plt.title('Input') plt.axis('off') plt.subplot(122) plt.imshow(dst) plt.title('Output') # plt.show() plt.axis('off')
4.图像二值化
图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓
代码如下
src = cv.imread('images\lena.jpg',cv.COLOR_BGR2GRAY) gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY) cv.imshow('input',gray) h, w = gray.shape[:2] m = np.reshape(gray, [1, w*h])#化为一维数组 mean = m.sum() / (w*h) print("mean: ", mean) ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY) cv.imshow('Binary',binary) cv.waitKey(0) cv.destroyAllWindows()
上面的cv.Threshold实现对灰度图像进行阈值操作得到二值图像
创作不易 觉得有帮助请点赞关注收藏~~~