Opencv学习笔记之图像基本操作

本文介绍了使用OpenCV进行图像和视频的基本操作,包括图像的读取、显示、保存,视频的打开、读取,以及图像的切片、颜色通道提取和边界填充等技术。此外,还展示了如何通过cv2.copyMakeBorder函数实现不同类型的边框效果。
摘要由CSDN通过智能技术生成

OpenCV学习<一>

一.图像基本操作

1.1使用的库

cv2 matplotlib numpy

正常直接导入即可

import cv2 #opencv读取的格式是BGR
import matplotlib.pyplot as plt
import numpy as np

1.2数据读取-图像

例程:将如图导入展示并保存

import cv2
import matplotlib.pyplot as plt
import numpy as np

img=cv2.imread('../photo/cat.jpg')
cv2.imshow("img",img)
while cv2.waitKey(0) != -1 :
    cv2.destroyAllWindows()
    cv2.imwrite('../save/cat_cg.jpg',img)
    break

1.2.1图像读取

函数:cv.imread(filename,[flags])

作用:从文件加载图像。函数 imread 从指定文件加载图像并返回它。如果无法读取图像(由于缺少文件、权限不当、格式不受支持或无效),该函数将返回一个空矩阵 。

参数:filename:文件的路径

flags:读取的方式,通常有默认值=IMREAD_COLOR

1.2.2图像显示

函数:cv.imshow(winname, mat)

作用:函数 imshow 在指定的窗口中显示图像。如果窗口是使用 cv::WINDOW_AUTOSIZE 标志创建的,则图像将以其原始大小显示,但仍受屏幕分辨率的限制。否则,图像将缩放以适合窗口。该函数可能会缩放图像,具体取决于其深度:

参数:winname:窗口名称

mat:要显示的图像

1.2.3等待按下的键

函数:cv.waitKey([delay])

作用:函数waitKey 无限期地等待密钥事件(当延迟≤0) 或延迟毫秒,当它为正时。由于操作系统在切换线程之间具有最短的时间,因此该函数不会完全延迟毫秒,它将至少等待延迟毫秒,具体取决于当时计算机上正在运行的其他内容。它返回按下的键的代码,如果在指定的时间过去之前没有按下任何键,则返回 -1。

参数:delay:延长的时间

1.2.4销毁所有窗口

函数:cv.destroyAllWindows()

作用:销毁所有 HighGUI 窗口。

该函数 destroyAllWindows 会销毁所有打开的 HighGUI 窗口。

参数:无

1.2.5保存图像

函数:cv.imwrite( filename,img,[params])

作用:将图像保存到指定文件。

函数imwrite将图像保存到指定的文件中

参数:filename:文件的名称目录

img:图像或要保存的图像

param:特定于格式的参数,通常为默认值,请参见 cv::ImwriteFlags

1.3数据读取-视频

import cv2  as cv
import matplotlib.pyplot as plt
import numpy as np
vc = cv.VideoCapture('../photo/test.mp4')
if vc.isOpened():
    open , frame = vc.read()
    while open :
        cv.imshow('video',frame)
        open, frame = vc.read()
        if cv.waitKey(10) & 0xFF == ord('q'):
            break

1.3.1打开视频

函数:cv.VideoCapture(filename)

作用:打开视频文件或捕获设备或 IP 视频流,以便使用 API 首选项捕获视频。

参数:filename:文件目录

1.3.2判断视频是否捕获

函数: cv.VideoCapture.isOpened()

作用:如果视频捕获已初始化,则返回 true。

参数:无

1.3.3读取

函数:cv.VideoCapture.read()

作用:该方法/函数在一次调用中结合了 VideoCapture::grab() 和 VideoCapture:retrieve()。这是读取视频文件或从解码中捕获数据并返回刚刚抓取的帧的最方便方法。如果未抓取任何帧(相机已断开连接,或者视频文件中没有更多帧),则该方法返回 false,函数返回空图像,会返回两个值

参数:无

1.4截取部分图像数据

1.4.1截取数据

使用数组的方式,例:

img=cv2.imread('cat.jpg')
cat=img[0:200,0:200] 
cv_show('cat',cat)

1.5颜色通道获取

import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('../photo/cat.jpg')
b , g , r = cv2.split(img)
cur_img_r = img.copy()
cur_img_r[:,:,0] = 0
cur_img_r[:,:,1] = 0
cv2.imshow('R',cur_img_r)
cur_img_g = img.copy()
cur_img_g[:,:,0] = 0
cur_img_g[:,:,2] = 0
cv2.imshow('G',cur_img_g)
cur_img_b = img.copy()
cur_img_b[:,:,2] = 0
cur_img_b[:,:,1] = 0
cv2.imshow('B',cur_img_b)
while cv2.waitKey(0) != -1 :
    cv2.destroyAllWindows()
    cv2.imwrite('../save/cur_img_r.jpg', cur_img_r)
    cv2.imwrite('../save/cur_img_g.jpg', cur_img_g)
    cv2.imwrite('../save/cur_img_b.jpg', cur_img_b)
    break

1.5.1提取单通道颜色

函数:cv.split(img)

作用:将多通道阵列划分为多个单通道阵列。返回值通常有三个即:B,G,R

参数:img:图片

1.5.2混合通道颜色

函数:cv.merge(b,g,r)

作用:从多个单通道阵列中创建一个多通道阵列

参数:三个单通道

1.6边界填充

import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('../photo/cat.jpg')
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)
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)
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()
while cv2.waitKey(0) != -1 :
    cv2.destroyAllWindows()
    break

1.6.1填充边界

函数:cv2.copyMakeBorder(src,top,bottom,left,right)

作用:给你的图片设置边界框,就像一个相框一样的东西

参数:src : 输入的图片

top, bottom, left, right :相应方向上的边框宽度

borderType:定义要添加边框的类型,它可以是以下的一种:

- BORDER_REPLICATE:复制法,也就是复制最边缘像素。
- BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb   
- BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
- BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg  
- BORDER_CONSTANT:常量法,常数值填充。

1.7数值计算

两图片相加相当于相同位置的数组相加,超过255的即对256取余处理

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值