基于python的opencv快速入门第一篇

基于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)

该代码比较常用,是固定套路,可以记住。

以上就是今日内容,因为主要在于实践,背后还有很多实验代码乃至于我用了一个下午学习该部分,大家也可以多加尝试

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值