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


前言

先说一些图像的基本知识:

(1)图像由像素构成,一个像素就是图片上的一个点。

(2)常见的图像有1通道(灰度图)、3通道(彩色图)、4通道(透明图),每个通道的像素值范围是[0,255],彩色图是我们最常见的,意思是每个像素由B、G、R三个值组成(也就是三原色),比如(255,255,255)表示白色。在这里插入图片描述

一、数据读取-图像

1.读取图像

opencv读取指定路径的图片,并显示出来

import cv2 #opencv读取的格式是BGR

img=cv2.imread('D:\kaibai.jpg',cv2.IMREAD_COLOR)#读取彩色图片
cv2.imshow('kaibai',img)#显示图像的名字,显示图片
cv2.waitKey(0)#等待时间,毫秒级,0表示任意键终止
cv2.destroyAllWindows()#触发关闭后,关闭图像

效果:
在这里插入图片描述
将图片转成灰度图并显示出来

import cv2 #opencv读取的格式是BGR

img=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读取的格式是BGR

img=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 cv2

video = 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:
        break
    if 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 plt

img=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读取的格式是BGR


img_cat=cv2.imread('D:\cat.jpg',cv2.IMREAD_COLOR)#读取图片
img_dog=cv2.imread('D:\dog.jpg',cv2.IMREAD_COLOR)
 img_cat2= img_cat +10 #每个像素点都加10
 img_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 plt

img_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为偏置项。
效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Thousand_drive/article/details/124461573