Python百日百行代码挑战-day11,opencv笔记(一)
写在前面
众所周知,opencv处理图像很好用。因此在做图像处理相关方向的时候,opencv可以说是必不可少的,既然要学就干脆一次学透,今天就尽可能地多学一些opencv的东西,一次性把所有问题全部解决掉吧。
需要用到的工具
- opencv
- numpy
- 阿里云
- 清华源
- opencv官网,直接搜ImreadModes
下载
这部分真就没啥好说的,上面工具部分有相应的网址,里面各种python库都有,点进去找相应的包安装了就行。这次需要安装的是opencv-contrib-python和numpy,点进去网址ctrl+F搜索一下就找到了。找到符合你的版本的安装包之后下载就行,格式大概是:
pip install numpy=1.21.0 -i https://mirrors.aliyun.com/pypi/simple/
在命令提示符里面用,-i后面的就是你要使用的镜像源,我一般用阿里云
图像处理基础部分
首先需要介绍一下基础知识
图像构成
图片是由像素构成的,元气骑士玩过吧,就那个感觉
下面这也是一个典型的图像是由像素构成的例子
图像分类
二值图像:只有0和1两个值的图像
灰度图像:值的范围在0-255,一共有256种等级,也就是除了黑白还有灰
RGB图像:就是彩色图像。一般在计算机里面都是这种图像。基本上计算机里面所有的这种颜色都可以通过RGB不同比例的搭配来完成。比如R(red)里面取了237份,G(green)里面取了175份,B(blue)里面取了58份。RGB图像就可以理解为是三份不同颜色的灰度图像混合起来的。
通常可以从RGB转为灰度图像,或者是灰度图像转为二值图像。
像素处理
读取元素
读取元素之前首先你得从系统中读取到这个图像,语法如下:
cv2.imread(img_path,type)
其中img_path部分就是你的图片路径,type就是读取的图片的类型,具体见下图
举例子
img1 = cv2.imread('1.jpg',cv2.IMREAD_UNCHANGED)
print(img1[100,100])
就跟读取矩阵的值似的,直接选择哪一个哪一个元素就行了,我这张图片是RGB图像,最后读取出来的就是1*3的一个矩阵,其中三个数字的意义是BGR(opencv里面这个好像是反的,比如你要是赋值给了[255,0,0],就变成了纯蓝色的)
修改像素
img1[100:150,100:150] = [163,234,68]
直接赋值,不是RGB格式的图片就给一个值就行了,不用再给三个了,我这里演示的是RGB图像,当然,赋值的元素顺序还是BGR。这是对区域进行修改。
使用numpy访问元素
读取像素
img3.item(100,100) # 注意只有二值图和灰度图可以这么搞,因为没有第三个参数,RGB就算了
修改像素
img3.itemset((100,100),255) # 把100,100这个位置像素的值改为255
举个全部的例子
print(img3.item(100,100))
img3.itemset((100,100),255)
print(img3.item(100,100))
print(img1.item(100,100,0))
img1.itemset((100,100,0),255)
print(img1.item(100,100,0))
自行读入图像,注意区分RGB和其他的图像,我的结果如下:
获取图像属性
形状
shape
像素点
size
类型
dtype
print(img1.shape) # 获取图像的形状
print(img3.shape) # 获取图像的形状,这个是灰度图,所以只有两个
print(img1.size) # 获取图像的像素点总数
print(img1.dtype) # 获取图像数据类型
我的结果如下:
ROI
英文是region of interest(感兴趣区域),这个东西还是比较常用的。
方法就是用前面写的那些,读取像素的办法获得ROI,改写像素的办法把ROI展现出来,我的代码如下,做了两个测试,分别是读取一张图片的部分结果,给这张图片的一部分和另一张图片的一部分,具体看例子
roi1 = img5[100:200,100:200]
img5[150:250,300:400] = roi1
cv2.imshow("img5",img5)
cv2.waitKey(0)
cv2.destroyAllWindows()
img6[150:250,300:400] = roi1
cv2.imshow("img6",img6)
cv2.waitKey(0)
cv2.destroyAllWindows()
通道操作
拆分
cv2.split
合并
cv2.merge
直接举例子
rows,cols,chn = img5.shape # 获取图像的形状数据
b,g,r = cv2.split(img5) # 通道拆分,拆分出来的顺序为b,g,r
cv2.imshow("b",b)
cv2.imshow("g",g)
cv2.imshow("r",r)
test1 = np.zeros((rows,cols),img5.dtype) # 创建一个空的,合并用的
test2 = np.zeros((rows,cols),img5.dtype)
res1 = cv2.merge([b,test1,test2]) # 合并通道
cv2.imshow("res1",res1)
cv2.waitKey(0)
cv2.destroyAllWindows()
我的结果如下:
总结
第一天就先这样吧
防火防盗防诈骗