Opencv学习笔记——图像基本操作
文章目录
- 前言
- 一、数据读取-图像
- 1.读取图像
- 2.读取部分图像
- 二、数据读取-视频
- 三、颜色通道提取
- 四、边界填充
- 五、数值计算
- 六、图像融合
前言
先说一些图像的基本知识:
(1)图像由像素构成,一个像素就是图片上的一个点。
(2)常见的图像有1通道(灰度图)、3通道(彩色图)、4通道(透明图),每个通道的像素值范围是[0,255],彩色图是我们最常见的,意思是每个像素由B、G、R三个值组成(也就是三原色),比如(255,255,255)表示白色。
一、数据读取-图像
1.读取图像
opencv读取指定路径的图片,并显示出来
import cv2 #opencv读取的格式是BGRimg=cv2.imread('D:\kaibai.jpg',cv2.IMREAD_COLOR)#读取彩色图片
cv2.imshow('kaibai',img)#显示图像的名字,显示图片
cv2.waitKey(0)#等待时间,毫秒级,0表示任意键终止
cv2.destroyAllWindows()#触发关闭后,关闭图像
效果:
将图片转成灰度图并显示出来
import cv2 #opencv读取的格式是BGRimg=cv2.imread('D:\kaibai.jpg',cv2.IMREAD_GRAYSCALE)#读取图片转成灰度图像
cv2.imshow('kaibai',img)#显示图像的名字,显示图片
cv2.waitKey(0)#等待时间,毫秒级,0表示任意键终止
cv2.destroyAllWindows()#触发关闭后,关闭图像
效果:
转换后的图像可以通过以下代码来保存:
cv2.imwrite('path',img)
path:保存图片的路径,img:需要保存的图片
还有一些基本的操作:
img.shape#img.shape[0]:图像的垂直尺寸(高度);img.shape[1]:图像的水平尺寸(宽度);img.shape[2]:图像的通道数
type(img)#查看图片格式
img.size#查看图片像素点个数
img.dtype#查看数据类型
2.读取部分图像
读取部分图像相当剪裁,指定图像的长和宽,然后读取。
import cv2 #opencv读取的格式是BGRimg=cv2.imread('D:\kaibai.jpg',cv2.IMREAD_COLOR)#读取图片
bord=img[0:200,0:200]
cv2.imshow('kaibai',bord)#显示图像的名字,显示图片
cv2.waitKey(0)#等待时间,毫秒级,0表示任意键终止
cv2.destroyAllWindows()#触发关闭后,关闭图像
效果:
二、数据读取-视频
原理:OpenCV读取视频包括从视频文件和摄像头读取。读取视频其实就是读取每一帧,相当于把每一帧当做图像来读取显示。cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。如果是视频文件,直接指定好路径即可。
import cv2video = cv2.VideoCapture('D:\Video\大肥猫.mp4')#读取视频文件
# 检查是否打开正确
if video.isOpened():oepn,frame = video.read()
else:open = False
#如果打开正确
while open:ret, frame = video.read()if frame is None:breakif ret == True:gray = cv2.cvtColor(frame, cv2.IMREAD_COLOR)cv2.imshow('result', gray)if cv2.waitKey(100) & 0xFF == 27:#按esc退出break
video.release()
cv2.destroyAllWindows()#关闭窗口
cv2.waitKey()是等待时间,毫秒级,0表示任意键终止,时间到了就切换下一帧,时间越慢,我们看到的视频效果就越满,太快则有可能看不到视频,相当于秒关。
效果:
opencv视频读取
三、颜色通道提取
用opencv进行通道提取要注意提取顺序,因为opencv读取图像格式是BGR而不是RGB。可以分别保留BGR中的一种颜色来查看效果。
import cv2 #opencv读取的格式是BGR
def cv_show(name,img):cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()
img=cv2.imread('D:\kaibai.jpg',cv2.IMREAD_COLOR)#读取图片
b,g,r=cv2.split(img)
# 只保留R
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv_show('R',cur_img)
# 只保留G
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,2] = 0
cv_show('G',cur_img)
# 只保留B
cur_img = img.copy()
cur_img[:,:,1] = 0
cur_img[:,:,2] = 0
cv_show('B',cur_img)
只保留R的效果:
四、边界填充
边界填充相当于在原来图像大小的基础上将图像扩大一圈。
import cv2 #opencv读取的格式是BGR
import matplotlib.pyplot as pltimg=cv2.imread('D:\kaibai.jpg',cv2.IMREAD_COLOR)#读取图片
top_size,bottom_size,left_size,right_size = (50,50,50,50)#上下左右分别填充的大小
#进行复制的补零操作, 只对边缘的点进行复制,然后该列上的点都是这些
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
#进行翻转的补零操作,举例只对当前对应的边缘 gfedcba|abcdefgh|hgfedcb
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
#进行翻转的补零操作, gfedcb|abcdefgh|gfedcb
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
#进行上下边缘调换的外包复制操作 bcdegh|abcdefgh|abcdefg
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
#默认下是填充黑色
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)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()
BORDER_REPLICATE:复制法,也就是复制最边缘的像素。
BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制,例如:gfedcba|abcdefgh|hgfedcb。
BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba。
BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg。
BORDER_CONSTANT:常量法,常数值填充。
五、数值计算
只有维度相同的图像才能相加,比如一张维度是(414,500,3),一张维度是 (429,499,3)就不能相加。
import cv2 #opencv读取的格式是BGRimg_cat=cv2.imread('D:\cat.jpg',cv2.IMREAD_COLOR)#读取图片
img_dog=cv2.imread('D:\dog.jpg',cv2.IMREAD_COLOR)img_cat2= img_cat +10 #每个像素点都加10img_cat[:5,:,0]#只打印前5行
相当于% 256
(img_cat + img_cat2)[:5,:,0]
最大就是255,超过255后取255
cv2.add(img_cat,img_cat2)[:5,:,0]
六、图像融合
图像融合相当于将两张图片叠加在一起,图像融合也是只有维度相同的图像才能融合。
import cv2 #opencv读取的格式是BGR
import matplotlib.pyplot as pltimg_cat=cv2.imread('D:\cat.jpg',cv2.IMREAD_COLOR)#读取图片
img_dog=cv2.imread('D:\dog.jpg',cv2.IMREAD_COLOR)
print(img_cat.shape)#(414, 500, 3)
print(img_dog.shape)#(429, 499, 3)
img_dog = cv2.resize(img_dog, (500, 414))#将狗的图像维度修改和猫的一样
#res = cv2.resize(img, (0, 0), fx=4, fy=4)#不指定图像的宽高,而是和原来的成比例
res = cv2.addWeighted(img_cat, 0.4, img_dog, 0.6, 0)
plt.imshow(res)
plt.show()
cv2.addWeighted(img_cat, 0.4, img_dog, 0.6, 0)其中0.4为img_cat在融合图像中权重,0.6为 img_dog在融合图像中权重,0为偏置项。
效果:
Opencv学习笔记——图像基本操作相关推荐
- Opencv学习笔记——图像伪色彩增强
以下均为github上opencv的个人学习笔记,原路径如下: https://github.com/JimmyHHua/opencv_tutorials 源码示例: import cv2 as cv ...
- opencv学习笔记——图像
图像 读入图像 全英文路径下图像的读取: retval = cv2.imread(文件名[,显示控制参数]) 含中文路径下图像的读取: retval = cv2.imdecode(np.fromfil ...
- Opencv学习笔记 图像特效 简单铅笔/卡通/马赛克/毛玻璃/Lomography/简单磨皮等效果
一.铅笔画滤镜 铅笔画滤镜主要是提取出图片中梯度比较高的部分,也就是边缘检测 二.卡通画特效 卡通画特效主要由三部分组成 1.提取图像中轮廓 => edges 2.使用bilateral 滤波在 ...
- Opencv学习笔记 图像清晰度评价
一.计算laplacian绝对值的方差 1.参考代码1 # import the necessary packages from imutils import paths import argpars ...
- opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
- OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc
OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...
- opencv学习笔记20:图像轮廓
图像轮廓 Contours:轮廓 轮廓是将没有连着一起的边缘连着一起. 边缘检测检测出边缘,边缘有些未连接在一起. 注意问题 1.对象为二值图像,首先进行阈值分割或者边缘检测. 2.查找轮廓需要更改原 ...
- opencv学习笔记19:图像金字塔和图像拉普拉斯金字塔 (用于图像放大和缩小)
图像金字塔原理 图像金字塔:只不同分辨率,不同尺寸子图构成的集合. 取样 向下取样:有一个图像G0,对它重新采样,得到分辨率小些的G1,以此类推. 向上取样:有一个图像G3,然后变成像素更多的G2,以 ...
- opencv学习笔记14:图像礼帽,图像黑帽
python + OpenCV 图像礼帽 图像礼帽 也叫图像顶帽 礼帽图像=原始图像-开运算图像 得到噪声图像 开运算:先腐蚀再膨胀 使用对象:二值图像 使用方法:morphologyEx cv2.M ...
最新文章
- spark的Web UI查看DAG的两种方式
- 上得写代码,下得作情诗,谁说程序员都是屌丝?
- 我是做Java的,刚入职了,月薪20k,面试题还是很管用的
- qt编写mysql导出excel_Qt编写数据导出到Excel及Pdf和打印数据
- 【FFmpeg4.1.4】音视频分离器
- 元宇宙8大创业方向:虚拟偶像、数字孪生…
- HALCON 18.11 Progress 发布说明
- html怎样计算网页浏览次数,从网站访客数、访问次数、浏览量分析SEO优化效果...
- 第11章:使用Apriori算法进行关联分析(从频繁项集中挖掘关联规则)
- 计算机无法进行磁盘碎片整理,无法运行磁盘碎片整理
- SQL语句 按年龄段分组统计人数
- php小卖铺源码,PHP自动化售货发卡网源码-小酒资源
- http协议之长连接与短连接服务器,长连接短连接
- Python 的 pytest 测试框架
- Meth | git 常用命令
- Android 11 替换Launcher后导致近期任务无效
- What does the CS_CLASSDC CS_OWNDC class style do?
- Linux 压缩、解压、打包详解
- qt5编译CMake程序,.ui文件不生成ui_ .h文件
- 软件测试-offer选择,自研or外包