Opencv计算机视觉入门——图像的操作

我不是女神ヾ 2021-11-26 08:01 391阅读 0赞

本人打算借助暑假的时间学习下Opencv计算机视觉的一些知识,于是想通过博客记录下自己的学习笔记,同时与大家分享~~

图像的基本操作

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Fuc2hpZGFzaGVu_size_16_color_FFFFFF_t_70

  1. 观察lena的图像,我们取其中一块进行细致的解读,如图我们取出一个区域,在这个区域中存在许多方格块,自左上我们可以依次标记为123……,其中每个小格叫做一个像素点,计算机中就是由这样一个个像素点来构成一张张图像的。那么像素点又是什么呢,直白的说,像素点就是一个值,如右侧矩阵内所示。像素点的值介于0~255之间,表示它的一个亮度,0表示为黑色,255表示为白色。图示RGB称为图像的颜色通道,通常情况下我们所见的彩色图像都是RGB通道的。右侧的矩阵即表示图像的大小,假设lena图像是500\*500,则它的图像的维度就为\[500,500,3\]

数据读取-图像

cv2.IMREAD_COLOR:彩色图像

cv2.IMREAD_GRAYSCALE:灰度图像

cv2.imread()的第二个参数包括以下三种写法:

cv2.IMREAD_COLOR : 默认使用该种标识。加载一张彩色图片,忽视它的透明度。

cv2.IMREAD_GRAYSCALE : 加载一张灰度图。

cv2.IMREAD_UNCHANGED : 加载图像,包括它的Alpha通道.。

提示:如果觉得以上标识太麻烦,可以简单的使用1,0,-1代替。(必须是整数类型)

  1. import cv2 #opencv的读取格式是BGR
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. img = cv2.imread('cat.jpg')
  5. print(img)
  6. #图像的显示,也可以创建多个窗口
  7. cv2.imshow('image',img)
  8. #等待时间,毫秒级,0表示任意中止
  9. cv2.waitKey(0)
  10. cv2.destroyAllWindows()

下面是图像的显示用函数封装起来:

  1. def cv_show(name,img):
  2. cv2.imshow(name,img)
  3. cv2.waitKey(0)
  4. cv2.destroyAllWindows()
  5. cv_show('image',img)

打印图像的大小及通道数:

  1. print(img.shape) #分别是图像的height、weight、通道数

读取并展示灰度图像:

  1. img = cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE) #读取灰度图像
  2. print(img)
  3. print(img.shape)
  4. cv_show('image',img)
  5. #保存图像
  6. cv2.imwrite('mycat.png',img)
  7. print(type(img)) #查看图像的格式
  8. print(img.size) #计算像素点的个数
  9. print(img.dtype) #查看数据的类型

数据读取-视频

cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。

如果是视频文件,直接指定好路径即可。

读取视频,将视频转换成灰度视频:

  1. import cv2 #opencv的读取格式是BGR
  2. vc = cv2.VideoCapture('WomanDay.mp4')
  3. if vc.isOpened():
  4. open, frame = vc.read()
  5. else:
  6. open = False
  7. while open:
  8. ret, frame = vc.read()
  9. if frame is None:
  10. break
  11. if ret == True:
  12. gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
  13. cv2.imshow('result',gray)
  14. if cv2.waitKey(10) & 0XFF == 27:
  15. break
  16. vc.release()
  17. cv2.destroyAllWindows()

截取部分图像数据

  1. cat = img[0:190,0:100]
  2. cv_show('image',cat)

颜色通道提取

  1. #切分
  2. b,g,r = cv2.split(img)
  3. print(b)
  4. print(b.shape)
  5. print(g)
  6. print(g.shape)
  7. print(r)
  8. print(r.shape)
  9. #组合
  10. img = cv2.merge((b,g,r))
  11. print(img.shape)
  12. '''
  13. B G R
  14. 0 1 2
  15. '''
  16. #只保留R
  17. cur_img = img.copy()
  18. cur_img[:,:,0] = 0
  19. cur_img[:,:,1] = 0
  20. cv_show('R',cur_img)
  21. #只保留G
  22. cur_img = img.copy()
  23. cur_img[:,:,0] = 0
  24. cur_img[:,:,2] = 0
  25. cv_show('G',cur_img)
  26. #只保留B
  27. cur_img = img.copy()
  28. cur_img[:,:,1] = 0
  29. cur_img[:,:,2] = 0
  30. cv_show('B',cur_img)

边界填充

  1. #边界填充
  2. top_size,bottom_size,left_size,right_size = (50,50,50,50)
  3. replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
  4. replect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT)
  5. reflect101 = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT_101)
  6. warp = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_WRAP)
  7. constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_CONSTANT,value=0)
  8. import matplotlib.pyplot as plt
  9. plt.subplot(231),plt.imshow(img,'gray'),plt.title('ORIGINAL')
  10. plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('Replicate')
  11. plt.subplot(233),plt.imshow(replect,'gray'),plt.title('REFELECT')
  12. plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
  13. plt.subplot(235),plt.imshow(warp,'gray'),plt.title('WARP')
  14. plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
  15. plt.show()

BORDER_REPLICATE:复制法,也就是复制最边缘像素。

BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制,例如hgfedcba|abcdefgh|hgfedcba

BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba

BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg

BORDER_CONSTANT:常量法,常数值填充。

数值计算

  1. #数值计算
  2. img_cat = cv2.imread('cat.jpg')
  3. img_dog = cv2.imread('dog.jpg')
  4. img_cat2 = img_cat +10
  5. print(img_cat[:5,:,0])
  6. print(img_cat2[:5,:,0])
  7. print((img_cat + img_cat2)[:5,:,0]) #相当于%256
  8. print(cv2.add(img_cat,img_cat2)[:5,:,0]) #>=时,最大取255

图像融合

  1. #图像融合
  2. import matplotlib.pyplot as plt
  3. img_cat = cv2.imread('cat.jpg')
  4. img_dog = cv2.imread('dog.jpg')
  5. #img_cat+img_dog 报错,img.shape的大小不一致
  6. print(img_cat.shape)
  7. print(img_dog.shape)
  8. img_dog = cv2.resize(img_dog,(500,414))
  9. print(img_dog.shape)
  10. res1 = cv2.addWeighted(img_cat,0.4,img_dog,0.6,0)
  11. plt.imshow(res1)
  12. plt.show()
  13. res2 = cv2.resize(img,(0,0),fx=3,fy=1) #x变为3倍,y变为1倍
  14. plt.imshow(res2)
  15. plt.show()
  16. res3 = cv2.resize(img,(0,0),fx=1,fy=3) #x变为1倍,y变为3倍
  17. plt.imshow(res3)
  18. plt.show()

发表评论

表情:
评论列表 (有 0 条评论,391人围观)

还没有评论,来说两句吧...

相关阅读

    相关 OpenCV计算机视觉利器

    OpenCV简介 OpenCV是一个开源的计算机视觉库,由英特尔公司发起并维护。它提供了丰富的图像处理和计算机视觉算法,涵盖了各种常见任务,如图像处理、目标检测和跟踪、人...