当前位置:   article > 正文

opencv入门--图像读取和处理_opencv 识别图片

opencv 识别图片

目录

1.计算机认识的图像

2.计算机读取图像

(1)读取

(2)显示

(3)灰度转化

(4)图像保存

(5)尺寸修改

(6)截取部分图像数据

(7)颜色通道提取

(8)边界填充

3.计算机读取视频


计算机认识的图像

1.RGB模型:包含个三通道,R红通道,G绿通道 ,B蓝通道

2.分辨率,即图像的解析度,单位英寸内的像素点数
3.灰度,表示图像像素的明暗程度的数值,即颜色深度。BGR格式图像的范围为0-255。白色为255,黑色为0。数据由矩阵构成

计算机读取图像

读取

首先将图像转化为计算机认识的东西,将图像读取为像素矩阵

  1. import cv2 #导入cv2模块
  2. import matplotlib.pyplot as plt
  3. import numpy as np #导入numpy基本数值计算工具包
  4. img=cv2.imread('test2.jpg') #读取图片

cv2.imread读出的数据类型是uint8;value是numpy array;图像数据以BGR的格式进行存储,,通道值默认范围0-255。图片维度可以表示为(h,w,c)h,w,c分别表示长,宽,通道数。

显示

将图片显示出来

  1. cv2.imshow('read1_img',img) #显示图像,给显示窗口命名
  2. cv2.waitKey(0) #使显示从窗口稍作等待
  3. cv2.destroyAllWindows()

waitKey()中的参数:若为0,表示按键盘任意键关闭窗口;

若非0,则表示以毫秒为单位的显示时间。

若有很多图像要显示,还可以将上述代码定义为一个函数

灰度转化

为什么要将图片灰度化呢?   图像灰度化的目的是为了简化矩阵,提高运算速度

灰度图像是R=G=B的一种特殊彩色图像,对计算机来说n彩色图片的信息含量过大,而进行图片识别时,其实只需要使用灰度图像里的信息就足够了。

操作时,可利用CACOLOR_BGR2GRAY或者IMREAD_GRSAYSCALE将图片灰度化

用img.shape查看图像h w c,前者c为3,后者不显示c数值。

  1. gray_img=cv2.imread('test2.jpg',cv2.CACOLOR_BGR2GRAY)
  2. cv2.imshow('gray_img',gray_img)

因为imread读进来的是BGR数据,所以这里做BGR转GRAY

 

图像保存

cv2.imwrite('gray_test.jpg',gray_img)

可以为保存的图像选择一个路径

尺寸修改

  1. import cv2
  2. gray_img=cv2.imread('text3.jpg',cv2.IMREAD_GRAYSCALE)
  3. resize_img = cv2.resize(gray_img,dsize=(200,200))
  4. #显示原图
  5. cv2.imshow('gray_img',gray_img)
  6. #显示修改后的
  7. cv2.imshow('resize_img',resize_img)
  8. #打印原图大小
  9. print('未修改:',gray_img.shape)
  10. #打印从修改的大小
  11. print('修改后:',resize_img.shape)
  12. cv2.waitKey(0)
  13. cv2.destroyAllWindows()

运行结果

 显示参数分别为(h,w,c)

补充:

img.shape 查看(h,w,c)

type(img)  查看图像格式

img.size    查看像素点数

img.dtype 查看数据类型

截取部分图像数据

指定截取图像的长、宽范围

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

颜色通道提取

将三个颜色通道切分出来,用split()   ,其中b,g,r顺序不能改变

  1. img=cv2.imread('cat.jpg')
  2. b,g,r=cv2.split(img)

切分之后,b,g,r的shape值是一样的

切分后想再组合回原样,可以用merge()函数

img=cv2.merge((b,g,r))

只保留R通道

按顺序,BGR分别为0,1,2。使BG都等于0以至于得到只保留R通道的图

[:,:,0],前面的::表示h w取所有

  1. cur_img = img.copy()
  2. cur_img[:,:,0] = 0
  3. cur_img[:,:,1] = 0
  4. cv.show('R',cur_img)

边界填充

top_size,bottom_size,left_size,right_size = (n1,n2,n3,n4)  其中n为要填充的像素点数

以一个图像填充方法BORDER_REFLECT为例

  1. import cv2
  2. img=cv2.imread('text3.jpg')
  3. top_size,bottom_size,left_size,right_size = (50,50,50,50)
  4. reflect = cv2.copyMakeBorder(img,top_size,bottom_size,
  5. left_size,right_size,cv2.BORDER_REFLECT)
  6. cv2.imshow('reflect',reflect)
  7. cv2.waitKey(0)
  8. cv2.destroyAllWindows()

不同borderType的比较
BORDER_REPLICATE:复制法,复制最边缘像素。
BORDER_REFLECT:反射法,对图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
BORDER_REFLECT_101:反射法,以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
BORDER_WRAP:外包装法abcdefgh|abcdefgh|abcdefg
BORDER_CONSTANT:常量法,常数值填充,需要在设置一个value值,已显示填充的颜色

  1. import cv2
  2. img=cv2.imread('text4.jpg')
  3. top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)
  4. #BORDER_REPLICATE
  5. replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REPLICATE)
  6. #BORDER_REFLECT
  7. reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT)
  8. #BORDER_REFLECT_101
  9. reflect_101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
  10. #BORDER_WRAP
  11. wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
  12. #BORDER_CONSTANT
  13. constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_CONSTANT)
  14. #绘制子图,plt.subplot作用是指定子图的位置
  15. import matplotlib.pyplot as plt
  16. plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
  17. plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title("REPLICATE")
  18. plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
  19. plt.subplot(234), plt.imshow(reflect_101, 'gray'), plt.title("REFLECT_101")
  20. plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
  21. plt.subplot(236), plt.imshow(constant, 'gray'), plt.title("CONSTANT")
  22. plt.show()
  23. cv2.waitKey(0)
  24. cv2.destroyAllWindows()

 

计算机读取视频

读取视频与读取图像很类似,因为视频相当于由一帧一帧图片组成

捕获视频——将其打开——读取每一帧——每一帧灰度化——显示处理后的视频

  1. import cv2
  2. #捕获视频
  3. vc = cv2.VideoCapture('text4.mp4')
  4. if vc.isOpened():
  5. open, frame = vc.read()
  6. else:
  7. open = False
  8. while open: #遍历视频每一帧
  9. ret, frame = vc.read() #读视频的每一帧
  10. if frame is None:
  11. break
  12. if ret == True:
  13. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  14. cv2.imshow('result',gray)
  15. #指定每一帧间隔时间,27为指定退出键来退出视频
  16. if cv2.waitKey(10) & 0xFF == 27:
  17. break
  18. vc.release()
  19. cv2.destroyAllWindows()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/263965
推荐阅读
相关标签
  

闽ICP备14008679号