注意:一下代码均在jyputer notebook上执行,所以换IDE可能要换一下代码。
图像
cv2.IMREAD_COLOR # 彩色图像,默认 cv2.IMREAD_GRAYSCALE # 灰度图像
-
读取一个彩色图像
import cv2 # opencv读取的格式是BGR img=cv2.imread('1.jpg') # 读取图像 def cv_show(name,img): # 通过一个函数来显示图像 cv2.imshow('name',img) cv2.waitKey(0) #等待时间,毫秒级,0表示任意键终止 cv2.destroyAllWindows() cv_show(img,img)View Code
-
读取一个灰度图像
import cv2 img=cv2.imread('1.jpg',cv2.IMREAD_GRAYSCALE) # 指定图像格式为灰度 def cv_show(name,img): cv2.imshow('name',img) cv2.waitKey(0) cv2.destroyAllWindows() cv_show(img,img)View Code
-
显示像素值
import cv2 img=cv2.imread('1.jpg') imgView Code
array([[[162, 167, 170], [162, 167, 170], [162, 167, 170], ..., [163, 166, 170], [163, 166, 170], [163, 166, 170]], [[162, 167, 170], [162, 167, 170], [162, 167, 170], ..., [163, 166, 170], [163, 166, 170], [163, 166, 170]], [[161, 166, 169], [161, 166, 169], [161, 166, 169], ..., [162, 165, 169], [162, 165, 169], [162, 165, 169]], ..., [[194, 192, 182], [194, 192, 182], [194, 192, 182], ..., [173, 177, 182], [171, 175, 180], [171, 174, 178]], [[194, 192, 182], [194, 192, 182], [194, 192, 182], ..., [173, 177, 182], [171, 175, 180], [171, 174, 178]], [[194, 192, 182], [194, 192, 182], [194, 192, 182], ..., [173, 177, 182], [171, 175, 180], [171, 174, 178]]], dtype=uint8)彩色图像像素值输出,三通道
array([[167, 167, 167, ..., 167, 167, 167], [167, 167, 167, ..., 167, 167, 167], [166, 166, 166, ..., 166, 166, 166], ..., [189, 189, 189, ..., 178, 176, 175], [189, 189, 189, ..., 178, 176, 175], [189, 189, 189, ..., 178, 176, 175]], dtype=uint8)灰度图像像素值输出,单通道
-
保存图像
cv2.imwrite('1.png',img) # 可以改变图片后缀
-
打印图像的类型
type(img)
numpy.ndarray
-
打印图像的大小
img.size
1454418
-
打印图像的数据类型
img.dtype
dtype('uint8')
-
打印图像的shape
img.shape
(1358, 1071) 这是灰度图像的,如果是彩色图像,输出就是 (1358, 1071, 3)
-
截取部分图像数据
import cv2 as cv img = cv.imread('1.jpg') part = img[0:50, 0:200] # 截取图片操作 cv.imshow('img', img) # 显示原始图 cv.imshow('part_img', part) # 显示被截取图 cv.waitKey(0) cv.destroyAllWindows()View Code
-
颜色通道提取
import cv2 as cv img = cv.imread('1.jpg') b, g, r = cv.split(img) # 将一张图片切分成三个通道 b # 显示b通道 # output # array([[162, 162, 162, ..., 163, 163, 163], # [162, 162, 162, ..., 163, 163, 163], # [161, 161, 161, ..., 162, 162, 162], # ..., # [194, 194, 194, ..., 173, 171, 171], # [194, 194, 194, ..., 173, 171, 171], # [194, 194, 194, ..., 173, 171, 171]], dtype=uint8)提取其中一个通道
cv.merge((b, g, r))将三个通道合并
import cv2 as cv img = cv.imread('1.jpg') cur_img = img.copy() # 复制图片 cur_img[:, :, 0] = 0 # 将B通道全部设置为0 cur_img[:, :, 1] = 0 # 将G通道全部设置为0 cv.imshow('cur_img', cur_img) # 只保留R通道 cv.waitKey(0) cv.destroyAllWindows()只保留某个通道,并显示
-
边界填充
import cv2 as cv import matplotlib.pyplot as plt img = cv.imread('2.jpg') top_size, bottom_size, left_size, right_size = (50, 50, 50, 50) # 设置上下左右填充的长度 replicate = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType = cv.BORDER_REPLICATE) # 填充类型为BORDER_REPLICATE,先复制img,再make,borderType可不写 reflect = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_REFLECT) # 填充类型为BORDER_REFLECT reflect_101 = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_REFLECT_101) # 填充类型为BORDER_REFLECT_101 wrap = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_WRAP) # 填充类型为BORDER_WRAP constant = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_CONSTANT, value = 0) # 填充类型为BORDER_CONSTANT,填充值为0,黑色 # plt.subplot(331):将划分成3*3九个区域,1表示图片中左上角,第一个块中 plt.subplot(331), plt.imshow(img, 'gray'), plt.title('ORIGIN') plt.subplot(332), plt.imshow(replicate, 'gray'), plt.title('REPLICATE') plt.subplot(333), plt.imshow(reflect, 'gray'), plt.title('REFLECT') plt.subplot(337), plt.imshow(reflect_101, 'gray'), plt.title('REFLECT_101') plt.subplot(338), plt.imshow(wrap, 'gray'), plt.title('WRAP') plt.subplot(339), plt.imshow(constant, 'gray'), plt.title('CONSTANT') plt.show()五种边界填充
- BORDER_REPLICATE:复制法,也就是复制最边缘的像素
- BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制。例如:dcba|abcd|dcba
- BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称。例如:dcb|abcd|cba
- BORDER_WRAP:外包装法。例如:abcd|abcd|abcd
- BORDER_CONSTANT:常量法,常数值填充。
-
数值计算
import cv2 as cv img = cv.imread('1.jpg') img[:5, :, 0] # 输出前第0层的前五行先输出img的值
array([[162, 162, 162, ..., 163, 163, 163], [162, 162, 162, ..., 163, 163, 163], [161, 161, 161, ..., 162, 162, 162], [161, 161, 161, ..., 162, 162, 162], [161, 161, 161, ..., 162, 162, 162]], dtype=uint8)
img2[:5, :, 0]再输出img2的值
array([[172, 172, 172, ..., 173, 173, 173], [172, 172, 172, ..., 173, 173, 173], [171, 171, 171, ..., 172, 172, 172], [171, 171, 171, ..., 172, 172, 172], [171, 171, 171, ..., 172, 172, 172]], dtype=uint8)
(img + img2)[:5, :, 0] # 以第一个值为例,162+172=334,然后334%256=78,如果两数相加超过了0-255,256个值,就取余。img,img2相加——方式1
array([[78, 78, 78, ..., 80, 80, 80], [78, 78, 78, ..., 80, 80, 80], [76, 76, 76, ..., 78, 78, 78], [76, 76, 76, ..., 78, 78, 78], [76, 76, 76, ..., 78, 78, 78]], dtype=uint8)
cv.add(img, img2)[:5, :, 0] # 这个函数也是相加,但是只要相加的值超过255,就取255,没有超过就取最大值img,img2相加——方式2
array([[255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255]], dtype=uint8)
-
图像融合(包含resize的使用)
import cv2 as cv import matplotlib.pyplot as plt cat = cv.imread('cat.jpg') dog = cv.imread('dog.jpg') print(cat.shape, dog.shape) # 猫的shape是(414, 500, 3),狗的shape是(429, 499, 3),明显不一样,不能融合 dog = cv.resize(dog, (500, 414)) # 将狗的shape改成和猫的一样 res = cv.addWeighted(cat, 0.4, dog, 0.6, 0) # 参考公式“R=αx+βy+b",cat是x,0.4是α,dog是y,0.6是β,0是偏置项b。 plt.subplot(131), plt.imshow(cat) plt.subplot(132), plt.imshow(dog) plt.subplot(133), plt.imshow(res)融合操作
import cv2 as cv import matplotlib.pyplot as plt cat = cv.imread('cat.jpg') cat1 = cv.resize(cat, (0, 0), fx = 1, fy = 3) cat2 = cv.resize(cat, (0, 0), fx = 3, fy = 1) plt.subplot(131), plt.imshow(cat) plt.subplot(132), plt.imshow(cat1) plt.subplot(133), plt.imshow(cat2)resize的另外一种使用方式
读取视频
-
读取视频并处理成灰度图像
import cv2 as cv v = cv.VideoCapture('run.mp4') # 检查是否打开正确 if v.isOpened(): open, frame = v.read() # open是一个bool值,frame代表一帧一帧的读取视频 else: open = False # 进行视频操作 while open: ret, frame = v.read() if frame is None: break if ret == True: gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # 将每一帧转换为灰度 cv.imshow('video', gray) if cv.waitKey(10) & 0xFF == 27: # cv.waitKey()里面的值可以控制播放速度,27指的是按下退出键就可以跳出循环,一般都指定27 break v.release() cv.destroyAllWindows()View Code