【Python 常用脚本及命令系列 12 -- OpenCV Python】

1. OpenCV Python

OpenCV是最常用的一种图像处理库,可以方便地与网络摄像头、图像和视频进行交互。它可以执行多种实时任务,于2000年首次发布。它因其简单性和代码可读性而出名。目前,它主要用于计算机视觉任务,如人脸检测和识别、目标检测等。

1.1 其他常用图像处理库

  • Pillow 是Python中常用的图像处理库之一。它提供了许多操作图像的函数,如调整大小、滤波操作等。这是Python中最好用的图像处理库之一。唯一的缺点是它已经很久没有更新了。
    安装安库的命令如下:
pip install pillow
  • Numpy库
    NumPy代表Numerical Python。它是一个Python库,可以帮助我们处理所有类型的科学计算。NumPy是在执行任何类型的数据预处理或数据科学相关任务时导入的第一个库。此外,它还可以用来进行图像处理操作。使用NumPy,我们可以轻松地操纵图像的RGB值。
    安装命令:
pip3 install --user numpy
  • Scipy库
    Scipy是Python中主要用于数学和科学计算的库,但同时它也可以用于处理多维图像。这是一个非常大的库,包含许多科学计算的工具。当使用Scipy库进行图像处理时,只需导入scipy.ndimage模块即可。
    安装scipy库的命令如下:
pip install scipy
  • Pgmagick库
    Pgmagick是Python库中GraphicsMagick的补充,它提供了许多图像处理的功能,比如调整大小、旋转、锐化、渐变等操作。
    安装pgmagick的命令如下:
pip install pgmagick

1.1.1 工具安装

  1. 执行 pip3 list 验证 pip3中是否安装了opencv-python
  2. 安装库
python -m pip install opencv-python

可能由于是网络的问题,所以需要用国内的镜像源来下载

pip install opencv-python -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

1.1.2 pip 清华大学开源软件镜像站

使用国内镜像速度会快很多:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple  pytesseract

1.2 opencv 入门

1.2.1 认识图像、读取图像

所谓的图像就是一个数组,所有对图像的处理就是对数字的处理。

import cv2 # 导入包
import numpy as np
    img = cv2.imread('rose.jpg')
    print(img)
    print(np.shape(img))

opencv读取图片后得到的是一个三维矩阵,三维数字矩阵,输出结果为:

[[[ 65 134 107]
  [ 65 134 107]
  [ 65 134 107]
  ..., 

1.2.2 显示图像

接下来我们来让读取的图像显示出来,刚才的图片太大了,我将图片弄小了一些

# 读取图片
img = cv2.imread(r'rose1.jpg')#
# 先创建一个窗口
cv2.namedWindow(r'Image')
# 在窗口中显示图像
cv2.imshow(r'Image', img)
# 最后还要写一句代码,这样就可以使窗口始终保持住
cv2.waitKey(0)
cv2.destroyAllWindows()#最后别忘了释放窗口,养成良好习惯。

运行结果为:…
在读取图片中,imread(‘图片地址’,‘模式参数’)函数可以来控制所读取图片的模式。
模式参数:
0:读入的为灰度图像(即使读入的为彩色图像也将转化为灰度图像)
1:读入的为彩色图像(默认)

img = cv2.imread('rose1.jpg', 0)

1.2.3 复制图像

img1 = img.copy()

1.2.4 保存图像

cv2.imwrite('rose_copy.jpg', img1)

第一个参数:是保存图像的地址以及文件的名字,
第二个参数:是所要保存的图像数组。
第三个参数:是针对特定的图像格式的处理:
对于JPEG:其表示的是图片的quality,用0-100的整数表示,默认为95。当然,你如果把参数设置的超过100也不会出错,但到100已经达到图片本身的最高质量了。cv2.IMWRITE_JPEG_QUALITY的类型为int类型,符合图像数组为整数的要求,不用再更改类型。

cv2.imwrite('rose_copy1.jpg', img1, [cv2.IMWRITE_JPEG_QUALITY, 2])

对于PNG: 第三个参数表示的是压缩级别。cv2.IMWRITE_PNG_COMPRESSION,从0到9,压缩级别越高,图像尺寸越小。默认级别为3.

cv2.imwrite("rose1_test.png", img, [cv2.IMWRITE_PNG_COMPRESSION, 0])
cv2.imwrite("rose2_test.png", img, [cv2.IMWRITE_PNG_COMPRESSION, 9])

1.3 opencv python 使用

OpenCV是一个 C++ 库,它涵盖了很多计算机视觉领域的模块。OpenCV有两个Python接口,老版本的cv模块使用OpenCV内置的数据类型,新版本的cv2模块使用NumPy数组。对于新版本的模块,可以通过下面方式导入:

import cv2

而老版本的模块则通过下面方式导入:

import cv2.cv

下面是一个简短的载入图像、打印尺寸、转换格式及保存图像为.png格斯的例子:

# -*- coding: utf-8 -*-
import cv2

# read image
im = cv2.imread('test.jpg') //return a NumPy array

# shape属性查看图像结构,返回行和列,通道多于1的话,再返回通道数
h, w = im.shape[:2]  //Python 的元组与列表类似,不同之处在于元组的元素不能修改

print h, w //字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割

cv2.imwrite('test.png',im)# imwrite可以根据.png后缀进行图像格式转换

imread()函数返回BRG格式的图像,BGR与RGB所表示的色彩空间相同,但是自己相反。

1.3.1 cv2常用接口函数

  1. 读入imread/imwrite
cv2.imread(filepath,flags) //读入一副图片:

filepath:要读入图片的完整路径
flags:读入图片的标志有一下分类:
cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道(透明度)
cv2.IMREAD_GRAYSCALE:读入灰度图片,这个过程所有颜色信息会丢失。
cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道

note:无论采用哪种模式imread函数会删除所有alpha通道(透明度)。

imwrite函数要求图像为BGR灰度格式,并且每一个通道要用一定的位(bit)。例如,bmp格式要求每个通道有8位,而PNG允许每个通道有8bit或者16bit

使用python标准os.urandom()函数可以随机生成原始字节,随后会把原始字节转换为NumPy数组。需要注意的是,诸如numpy.random.randint(0,256,120000).reshape(300,400)语句也能直接(并且更高效)随机生成NumPy数据。

使用numpy.array函数来转化数组比普通的Python数组转化要快得多。numpy.array提公的
item() 函数有三个参数:x(或左)位置,y(或顶部)位置以及(x,y)位置的数组索引,
itemset()有两个参数:一个三元数组(x, y和索引)和要设置的值。

import cv2
import numpy as np
img =cv.imread('mypic.png')
print img.item(150,120,0) //prints the current value of B for that pixel
img.itemset((150, 120,0),255)
print img.item(150, 120,0) //prints 255

上面的像素操作效率很低,特别是在视屏处理的时候,所以可以用索引(indexing)来解决这个问题,如,使用下面代码可以将图像的所有G(绿色)值设置为0:

img = cv.imread('mypic.png')
img[: , :, 1] = 0 (BGR)

1.3.2 ROI(Region Of Interst)

可以通过numpy来设置感兴趣的区域,一旦设定了该区域,就可以执行许多操作,例如,将该区域与变量绑定,然后设定第二个区域,并将第一个区域的值分配给第二个区域(将图像的一部分copy到该图像的另一个位置)

img = cv.imread('mypic.png')
my_roi = img[0:100 ,0 :100] #设定感兴趣的区域
img[300:400 , 300 :400] = my_roi #图像copy

1.3.3 图像属性的获得

print img.shape
print img.size
print img.dtype

shape: NumPy 返回包含宽度,高度和通道数(如果图像是彩色)的数组,如果图像是单色或者是灰度的,将不包含通道值。
size: 图像的像素大小
Datatype:图像的数据类型,也即每一个像素所占的bit位。
note: 如果用OpenCV就必须要熟悉numpy.array库,以为numpy.array库是python处理图像的基础。

1.3.4 视屏文件的读写

camera 视屏

1.3.5 窗口显示图像

单独使用imshow时,图象会显示出来,但是随即会消失。下面代码可以保证显示视屏时窗口上的帧可以一直进行更新。

img = cv2.imread('my-image.png')
cv2.imshow(‘my image’, img) #显示图像的帧名称以及要显示的图像本身
cv2.waitKey(ms_value)
cv2.destroyAllWindows() #释放OpenCV创建的所有窗口。

waitKey等待键盘输入,单位为毫秒,即等待指定的毫秒数看是否有键盘输入,若在等待时间内按下任意键则返回按键的ASCII码,程序继续运行。若没有按下任何键,超时后返回-1。Python提供了一个标准函数ord(),该函数可以将字符转化为ASCII码。例如,输入ord('a')会返回97.
参数为0: 表示无限等待。不调用waitKey的话,窗口会一闪而逝,看不到显示的图片。

cv2.destroyAllWindow()

:销毁所有窗口

cv2.destroyWindow(wname)

: 销毁指定窗口

1.3.6 保存图像

保存一个图像。

cv2.imwrite(file,img,num)

第一个参数是要保存的文件名,
第二个参数是要保存的图像。
第三个参数(可选的),它针对特定的格式:
对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;
对于png ,第三个参数表示的是压缩级别。默认为3.

注意:

cv2.IMWRITE_JPEG_QUALITY类型为 long , //必须转换成 int
cv2.IMWRITE_PNG_COMPRESSION, //09 压缩级别越高图像越小。
cv2.imwrite('1.png',img, [int( cv2.IMWRITE_JPEG_QUALITY), 95])
cv2.imwrite('1.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])

1.4 颜色空间

OpenCV中,在opencv中有超过150种颜色空间转换方法,但是经常用的只有BGR-灰度图BGR-HSV,图像不是用常规的RGB颜色通道来存储的,它们用的是BGR顺序。当读取一幅图像后,默认的是BGR,不过有很多转换方式是可以利用的。颜色空间转换可以用函数 cvtColor() 函数。

cv2.cvtColor(input_image ,flag)

flag是转换类型:
BGR灰度图的转换使用 cv2.COLOR_BGR2GRAY
BGRHSV的转换使用 cv2.COLOR_BGR2HSV

注意HSV空间中:

  • H表示色彩/色度,取值范围 [0,179]
  • S表示饱和度,取值范围 [0,255]
  • V表示亮度,取值范围 [0,255]

但是不同的软件使用值不同。HSV空间比在BGR空间中更容易表示一个特定的颜色。

下面是一个转换为灰度图像的例子:

import cv2
im = cv2.imread('../data/empire.jpg')
# create a grayscale version
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)

1.5 NUMPY

1.5.1 np.dot()

线性代数中的乘法,

1.5.2 np.multiply()

对应元素相乘

1.5.3 np.prod

计算所有元素的乘积,对于有多个维度的数组可以指定轴,如axis=1指定计算每一行的乘积。

ImportError: numpy.core.multiarray failed to import

python3 -m pip install numpy==1.14.5 -i https://pypi.tuna.tsinghua.edu.cn/simple

1.6 文字识别

本篇文章主要参考了 python图像处理之识别图像中的文字 这篇文章,在实现的过程中出现了些偏差,特此记录。
1)pipe3 list 查看是否已经安装了pillow
安装pillow:

pip install pillow.

2)安装 pytesser3
3)安装 autopy3
先安装 wheel,即先在命令提示符中输入pip install wheel, 然后再安装 autopy3.

pip install autopy3 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

1.6.1 安装Tesseract-OCR

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

主公CodingCos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值