首页
视频
资源
登录
原
OpenCV 图像基本操作(学习笔记)
1503
人阅读
2024/1/7 14:24
总访问:
2633604
评论:
0
收藏:
0
手机
分类:
opencv
![](https://img.tnblog.net/arcimg/hb/3c9a034e352c4476b4ec6d8cc07a0263.png) >#OpenCV 图像基本操作(学习笔记) [TOC] ![](https://img.tnblog.net/arcimg/hb/b485d5c24cda4614827bb063719e2b66.png) tn2>在一张图像中,每取出一个像素块会分成红绿蓝三种颜色通道,每一种颜色通道都是一组矩阵,并且取的是颜色范围值0-255。 ## 数据读取图像 | 参数 | 描述 | | ------------ | ------------ | |cv2.IMREAD_COLOR|彩色图像| |cv2.IMREAD_GRAYSCALE|灰度图像| ```python import cv2 #opencv读取的格式是BGR import matplotlib.pyplot as plt # 待会展示图片 import numpy as np # 直接展示出来,不需要单独弹出一个窗口 %matplotlib inline # 加载图片 img=cv2.imread('cat.jpg') ``` ```python img # 接收的是一个numpy array的值,dtype=uint8的取值范围在0-255之间,每一组小的矩阵都是一个像素点 ``` ![](https://img.tnblog.net/arcimg/hb/b4c5b2f1480b4d51b0031f28f6bdab71.png) ```python #图像的显示,也可以创建多个窗口 cv2.imshow('image',img) # 等待时间,毫秒级,0表示任意键终止 cv2.waitKey(0) cv2.destroyAllWindows() ``` ![](https://img.tnblog.net/arcimg/hb/4122e3399af64d57ab998b499ee4e3ef.png) tn>注意:我这里爆了一个错The kernel appears to have died. It will restart automatically. tn2>这是因为`cv2.imshow`依赖于GUI的正常运行,而Jupyter Notebook通常不支持这种与GUI相关的操作。 `cv2.imshow`可能无法正确处理窗口的关闭和资源释放,从而导致内核崩溃。 可以改用plt进行显示 ```python # 定义一个函数去展示我们的图像 def cv_show(name,img): cv2.imshow(name,img) cv2.waitKey(0) cv2.destroyAllWindows() ``` ```python # 图像的高度为 414 像素,宽度为 500 像素,并且有 3 个通道 img.shape ``` >(414, 500, 3) ```python # 读取灰度图 img=cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE) img ``` ![](https://img.tnblog.net/arcimg/hb/77ac76d83d80480fa0adcd5aec43d8b0.png) ```python img.shape ``` >(414, 500) ```python #图像的显示,也可以创建多个窗口 cv2.imshow('image',img) # 等待时间,毫秒级,0表示任意键终止 cv2.waitKey(10000) cv2.destroyAllWindows() ``` ![](https://img.tnblog.net/arcimg/hb/7d4a68d3eb614c1dabe18f21672eff45.png) ```python #保存 cv2.imwrite('mycat.png',img) ``` >True ```python # 是一个numpy.ndarray格式 type(img) ``` >numpy.ndarray ```python # 像素点的个数 img.size ``` >207000 ```python # 像素类型 img.dtype ``` >dtype('uint8') ## 数据读取-视频 tn2>视频仍然是每一帧的图片不断的播放形成的,所以我们每获取一帧的图片也是一个[h,w,c]。 - cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。 - 如果是视频文件,直接指定好路径即可。 ```python vc = cv2.VideoCapture('test.mp4') ``` ```python # 检查是否打开正确 if vc.isOpened(): # open该视频是否能打开,frame是BGR hwc,vc.read()获取每一帧的BGR open, frame = vc.read() else: open = False ``` ```python # 循环读取每一帧的 while open: ret, frame = vc.read() if frame is None: break if ret == True: # BGR转成灰度图 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 显示图片 cv2.imshow('result', gray) # 等待多长时间显示下一张 if cv2.waitKey(100) & 0xFF == 27: break vc.release() cv2.destroyAllWindows() ``` ![](https://img.tnblog.net/arcimg/hb/eb589ffb5f154663b3c84d50f9d93ae2.gif) ## 截取部分图像数据 tn2>ROI就是取出图片中部分的截图 ```python img=cv2.imread('cat.jpg') cat=img[0:50,0:200] cv_show('cat',cat) ``` ![](https://img.tnblog.net/arcimg/hb/968e682d8ecb472eb646c7da56711f76.png) ## 颜色通道提取 ```python b,g,r=cv2.split(img) r ``` ![](https://img.tnblog.net/arcimg/hb/4a828e1cbb504c4fa6effa14a50d751e.png) ```python img=cv2.merge((b,g,r)) img.shape ``` >(414, 500, 3) ```python # 只保留R cur_img = img.copy() cur_img[:,:,0] = 0 cur_img[:,:,1] = 0 cv_show('R',cur_img) ``` ![](https://img.tnblog.net/arcimg/hb/32732813f2854b339b5e0be2ba65253b.png) ```python # 只保留G cur_img = img.copy() cur_img[:,:,0] = 0 cur_img[:,:,2] = 0 cv_show('G',cur_img) ``` ![](https://img.tnblog.net/arcimg/hb/76f6312fd5434f52ba1c67cbb87a5df5.png) ```python # 只保留B cur_img = img.copy() cur_img[:,:,1] = 0 cur_img[:,:,2] = 0 cv_show('B',cur_img) ``` ![](https://img.tnblog.net/arcimg/hb/1094790b28be4085afc4fe9af5d27876.png) ### 边界填充 tn2>就是在图的边界进行填充图像内容。 ```python # 在上下左右都填充的大小 top_size,bottom_size,left_size,right_size = (50,50,50,50) # 通过copyMakeBorder进行不同类型填充 # 复制末尾一点进行衍生 replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE) # 反射最后大小区域那段 reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT) # 也是反射就是不反射最开始的那一点和最后的那一点 reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101) # 在一次从对面开头进行复制衍生 wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP) # 填充常数,这里那0填充的所以是黑的 constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0) ``` ```python import matplotlib.pyplot as plt plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL') plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE') plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT') plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101') plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP') plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT') plt.show() ``` ![](https://img.tnblog.net/arcimg/hb/12bab28434e9421fbf335ba263a57e18.png) tn2>`BORDER_REPLICATE`:复制法,也就是复制最边缘像素。 `BORDER_REFLECT`:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb `BORDER_REFLECT_101`:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba `BORDER_WRAP`:外包装法cdefgh|abcdefgh|abcdefg `BORDER_CONSTANT`:常量法,常数值填充。 ## 数值计算 ```python img_cat=cv2.imread('cat.jpg') img_dog=cv2.imread('dog.jpg') ``` ```python # 在原始位置都加个10 img_cat2= img_cat +10 img_cat[:5,:,0] ``` ![](https://img.tnblog.net/arcimg/hb/aa521f632d214c25a09b802b913acfed.png) ```python # 打印前五行 img_cat2[:5,:,0] ``` ![](https://img.tnblog.net/arcimg/hb/9896bff2e7264ee2952fa039df6c07c7.png) ```python #相加超出256之后,相当于% 256 (img_cat + img_cat2)[:5,:,0] ``` ![](https://img.tnblog.net/arcimg/hb/412827d243f8434c9d2f1b0e83bfcc0d.png) ```python # add函数相加,只要大于255了就以最大值为准 cv2.add(img_cat,img_cat2)[:5,:,0] ``` ![](https://img.tnblog.net/arcimg/hb/4212c2208bde428d8e0b392bff83cf01.png) ## 图像融合 tn2>举例:我们将猫的图片和狗的图片部分添加在一起。 ```python # 将狗的shape设置为与猫一样的维度 img_dog = cv2.resize(img_dog, (500, 414)) img_dog.shape ``` >(414, 500, 3) tn2>添加权重img_cat为x1,img_dog为x2。 0.4是img_cat的权重,0.6是img_dog的权重在加上一个偏置项b=0。公式如下: $$ R=x_1\alpha+x_2\beta+b $$ tn2>这样通过`addWeighted`函数,可以进行一些图像融合的操作。 ```python res = cv2.addWeighted(img_cat, 0.4, img_dog, 0.6, 0) plt.imshow(res) ``` ![](https://img.tnblog.net/arcimg/hb/c456c0fa05a34eadabafd33047bac068.png) ```python # fx 表示x轴乘以多少倍,这里是4倍 # fy 表示y轴乘以多少倍,这里是4倍 res = cv2.resize(img, (0, 0), fx=4, fy=4) plt.imshow(res) ``` ![](https://img.tnblog.net/arcimg/hb/c8697311de7e4a2abcdbc9953991b92e.png) ```python res = cv2.resize(img, (0, 0), fx=1, fy=3) plt.imshow(res) ``` ![](https://img.tnblog.net/arcimg/hb/d802d3ab72214ff58f24e6dd9ec93392.png)
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
👈{{preArticle.title}}
👉{{nextArticle.title}}
评价
{{titleitem}}
{{titleitem}}
{{item.content}}
{{titleitem}}
{{titleitem}}
{{item.content}}
尘叶心繁
这一世以无限游戏为使命!
博主信息
排名
6
文章
6
粉丝
16
评论
8
文章类别
.net后台框架
171篇
linux
17篇
linux中cve
1篇
windows中cve
0篇
资源分享
10篇
Win32
3篇
前端
28篇
传说中的c
4篇
Xamarin
9篇
docker
15篇
容器编排
101篇
grpc
4篇
Go
15篇
yaml模板
1篇
理论
2篇
更多
Sqlserver
4篇
云产品
39篇
git
3篇
Unity
1篇
考证
2篇
RabbitMq
23篇
Harbor
1篇
Ansible
8篇
Jenkins
17篇
Vue
1篇
Ids4
18篇
istio
1篇
架构
2篇
网络
7篇
windbg
4篇
AI
18篇
threejs
2篇
人物
1篇
嵌入式
3篇
python
13篇
HuggingFace
8篇
pytorch
9篇
opencv
6篇
Halcon
3篇
最新文章
最新评价
{{item.articleTitle}}
{{item.blogName}}
:
{{item.content}}
关于我们
ICP备案 :
渝ICP备18016597号-1
网站信息:
2018-2024
TNBLOG.NET
技术交流:
群号656732739
联系我们:
contact@tnblog.net
欢迎加群
欢迎加群交流技术