基于python的opencv快速入门第一篇
太原理工大学机器人团队20日打卡day14
1、图像处理基础
opencv是一个基于BSD许可发行的跨平台计算机视觉库,而在我个人看来,因为其可以用于Linux,也就意味着可以装载在树莓派的嵌入式系统上。十分有利于我开发机器人视觉方面的问题。当然,我并不是计算机专业,对于其中更深层次的算法没有追求,还是追求更高效的利用这个库来完善我的机器人等方面。
其中配置安装方面的问题我就不多加赘述,csdn上有许多相关文章,建议大家可以看,如果有问题私聊相关作者也是十分不错的选择。
当然,本人认为该方面应用更难,所以会尝试写出更多练习代码,当然,大部分源于李立宗的《Opencv轻松入门:面向Python》。这只是我总结的知识点,便于忘记时候快速查询,而不是一篇教程。
1.1图像基本表示方法
1. 二值图像
- 仅包含黑白两个颜色。
- 矩阵上只有0和1两个数字
2. 灰度图像
- 计算机把从纯黑到纯白分为256个灰度级(“0”表示纯黑,“255”表示纯白)
- 矩阵每个像素点有(0,255)来表示该点对应灰度
3. 彩色图像
- 图像分为RGB三个通道
- 每个通道值都在[0,255]
1.2像素处理
1. 生成矩阵
- 我们可以利用Numpy库中zeros()来生成矩阵
- 代码如下
import numpy as np
img = np.zeros((8,8),dytpe = np.uint8)
Notes:
- as np 可以不适用,但是使用可以更简便
- 该代码表示生成一个8x8的灰度矩阵
- 在利用矩阵知识,就可以控制其中的像素点
img[0,3] = 255
Notes:
- 该代码表示将[0,3]像素改为白色
2. 读取图像
- 可以利用cv2库里的imread函数
- 格式如下
import cv2
img = cv2.imread("img.jpg",0)
Notes:
- 表示读取img灰度图像
3. 彩色图像
- 彩色图像相比较与灰度图像,实际上只是增加了第三个变量
- 由[0,2]分别表示BGR通道
而利用zeros生成对应矩阵代码为
img = np.zeros((300,300,3),dtype=np.uint8)
- 小示例:
- 生成一个三维数组,用来观察三通道的变化情况
import cv2
import numpy as np
img = np.zeros((300,300,3),dtype=np.uint8)
img[:,:,0] = 255
img[:,:,1] = 255
img[:,:,2] = 255
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()
- 其中imshow表示弹出一个窗口显示画面,名叫img
- imshow函数下必须有waitkey()函数
- 该函数表示等待输入,如果有按键退出窗口
- destroyAllwindows表示关闭所有窗口
- 都是一些比较基本的函数,记住即可
1.3 使用numpy.array访问像素
- 函数item()可以更高效的访问像素点
- 语法格式为
item(行,列,通道)
示例:
- 读取First.jpg的第一行第一列的G通道数值
import cv2 lena = cv2.imread("First.jpg") print("读取像素点= ", lena.item(1,1,1))
- 函数itemst()可以用来修改像素值
- 语法格式为
itemset(索引值,新值)
示例
生成一个灰度图像,其中的像素值均为随机数
import numpy as np
import cv2
img = np.random.randint(0,256,size=[256,256],dtype = np.uint8)
cv2.imshow("demo",img)
cv2.waitKey()
cv2.destoryAllWindows
1.4感兴趣区域(ROI)
图像中的数字分别表示行号和列号。那么,图像中黑色ROI可以表示为
img[200:400,200:400]
通过一下语句可以将ROI复制到该区域右侧
a=img[200:400,200:400]
img[200:400,600:800]=a
同时,也可以使用该方法进行打码处理
import cv2
import numpy as np
a=cv2.imread("lenacolor.png", cv2.IMREAD_UNCHANGED)
cv2.imshow("original", a)
face=np.random.randint(0,256, (180,100,3))
a[220:400,250:350]=face
cv2.imshow("result", a)
cv2.waitKey()
cv2.destroyAllWindows()
1.5 通道操作
通道拆分
- 可以通过索引拆分
- 比较麻烦,直接讲第二种
- 通过cv2.split(img)函数拆分
- 语法如下
b,g,r = cv2.split(img)
通道合并
- 利用cv2.merage()可以实现合并
- 语法如下
rgb=cv2.merge([r,g,b])
示例
先拆分通道,再表示b,br分别为0的图像
再合并图像
import cv2
lena = cv2.imread("First.jpg")
cv2.imshow("lena1",lena)
b,g,r = cv2.split(lena)
cv2.imshow("b",b)
cv2.imshow("g",g)
cv2.imshow("r",r)
lena[:,:,0]=0
cv2.imshow("lenab0",lena)
lena[:,:,1]=0
cv2.imshow("lenab0g0",lena)
bgr=cv2.merge([b,g,r])
cv2.imshow("bgr",bgr)
cv2.waitKey()
cv2.destroyAllWindows()
图像运行结果可自行尝试
1.6 获取图像属性
import cv2
color = cv2.imread("First.jpg")
print("图像colorshux:")
print("color.shape=", color.shape)
print("color.size=", color.size)
print("color.dtype= ",color.dtype)
该代码比较常用,是固定套路,可以记住。
以上就是今日内容,因为主要在于实践,背后还有很多实验代码乃至于我用了一个下午学习该部分,大家也可以多加尝试