0.前言
· 做图像处理少不了OpenCV,OpenCV功能强大且轻量,可以跨平台使用,十分实用。今年9月其使用CUDA的接口也被实现了。笔者作为第一次使用OpenCV的小白,在这里记录和分享一下OpenCV在python上的简单使用。
这里分享两个实用的网站:
OpenCV各版本全模块说明文档:OpenCV Modules
OpenCV说明文档下载网址:OpenCV Download
1. OpenCV的安装
· 这个网上的教程挺多的,这里不做太多教程了(因为我的博客没有人看 )。
· 只介绍一种安装方式:在终端中激活虚拟环境后(如果没创建虚拟环境就不用这一步)直接pip install就行。在我的电脑上具体如下:
activate tensorflow_cpu
pip install opencv-python
· 然后在python命令下import cv2
成功了表示安装完成。输入cv2.__version__
可以查看OpenCV的版本,我这里是4.1.1
。
2. 简单的图像处理操作
#所有的cv2都用cv
import cv2 as cv
2.1 图像输入
img = cv.imread(filename[, flags])
· 这个函数可以将.jpg\.png
等图片读入,值得注意的是,读入能否成功仅和文件的数据格式有关,和后缀名没有任何关系。其中:flags表示读取的方式,其实有很多种方式,具体可以参考官方文档:Image file reading and writing。这里只介绍三种:
取值 | 含义 |
---|---|
-1(默认) | 表示按照图片编码读入,不做任何处理,保留所有数据 |
0 | 图像灰度处理后把所有像素点按照灰度值储存 |
1 | 图像保留RGB三通道的值,每个像素点都保存RGB值 |
· 该函数返回的是一个cv::Mat
的结构,说白了就是一个矩阵,使用img.shape
可以查看矩阵的维度:长宽以及每个像素点的维度。
- 这里给出一个我在学习时候的例子:
img = cv.imread("I:\\Master\\Lab\\EMCManagement\\code\\testCV\\test01\\pic\\b.jpg",1)
print(img.shape) #(1010,1380,3)
cv.imshow("", img)
cv.waitKey(0)
cv.destroyAllWindows()
- 输出图像
- 解释
- 可以看到,
img.shape
输出了(1010,1380,3)表示该图片高度是1010个像素点,宽度是1380个像素点,每个像素点保存了3个值。 cv.imshow("",img)
在新窗口显示图片,waitKey(0)
相当于system("pause")
。
2.2 图像输出和压缩
cv.imwrite(filename[, flags])
cv.resize(img,dsize[, dst[, fx[, fy[, interpolation]]]] )
· 具体可选参数的含义在前言的文档中都有详细说明,这里不赘述了,一般而言我们都用默认值。值得注意的是在图片压缩函数cv.resize()
中,dsize
要传入一个元组,表示(宽,高),不要写反了。
2.3 图片批量裁剪
· 因为实验需要,我要把一张图像切蛋糕一样切均匀切成很多份。OpenCV提供了一个非常方便的方法,和python的切片一样:img_temp = img[0:50, 0:50]
就表示把img图片的左上50x50像素点阵保存进img_temp里,这就实现了图片的裁剪。
· 我利用这个方法构建了一个函数,这个函数可以指定裁剪尺寸并将裁剪的图片进行存储:cutImgIntoPieces(img, outputDir, space)
其中space传入一个元祖,表示裁剪在(高,宽)上的间隔。
- 实验如下:(我把此函数封装进了cxyFunc.py中)
import cv2 as cv
import cxyFunc as cxy
img = cv.imread("I:\\Master\\Lab\\EMCManagement\\code\\testCV\\test01\\pic\\b1.jpg",0)
img = cv.resize(img,(500, 400))
outputDir = "I:\\Master\\Lab\\EMCManagement\\code\\testCV\\test01\\pic\\bePrcessed\\temp"
cxy.cutImgIntoPieces(img, outputDir,20,50)
-
结果如下
可以看到,图片被成功的裁剪了。 -
函数代码如下,我也顺便写了一个用来显示图片的函数,因为这个函数还蛮常用的。
import cv2 as cv
def showImg(img, *imgName):
if(len(imgName) == 0):
name = "untitled"
else:
name = imgName[0]
cv.imshow(name, img)
cv.waitKey(0)
cv.destroyAllWindows()
def cutImgIntoPieces(img, outputDir, *space):
index_x, index_y, width, height = 1,1,0,0
img_size_height,img_size_width = img.shape[0], img.shape[1]
if(len(space) > 1):
space_height,space_width = space[0],space[1]
else if(len(space) == 0):
space_height,space_width = img.shape[0], img.shape[1]
else:
space_height,space_width = space[0]
while(True):
while(True):
img_temp = img[height : height+space_height, width : width+space_width]
cv.imwrite(outputDir + "\\img_%d_%d.jpg" %(index_x, index_y), img_temp)
index_y += 1
if weight >= (img_size_width - space_width):
break
else:
width += space_width
if height >= (img_size_height - space_height):
break
else:
width = 0
index_y = 1
height += space_height
index_x += 1
3. 总结
· 最近真的太忙了,没有时间写博客,也没有时间学习自己的东西,今后会不定期更新一些关于cv或者其他方面的应用。我姑且一写,有缘的话你姑且一看。最近有很多对于人生的感悟,人不过是茫茫宇宙中的一粒沙,我们现在的技术到底在宇宙中是一种怎样的存在,谷歌最近发布了关于量子计算的论文,我突然有点想去投身这种科研事业中去看一看现在人类的极限是什么。有机会我打算写一写关于量子纠缠的东西,如果量子真的能跨维度交流,那这个世界可就太神奇啦。