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

一、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实现对灰度图像进行阈值操作得到二值图像

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

精彩内容

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。
大家都在看: