Python百日百行代码挑战-day11,opencv笔记(一)

写在前面

众所周知,opencv处理图像很好用。因此在做图像处理相关方向的时候,opencv可以说是必不可少的,既然要学就干脆一次学透,今天就尽可能地多学一些opencv的东西,一次性把所有问题全部解决掉吧。

需要用到的工具

下载

这部分真就没啥好说的,上面工具部分有相应的网址,里面各种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()

我的结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

第一天就先这样吧
防火防盗防诈骗

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值