写点什么

Opencv 图像处理:图像基础操作与灰度转化

作者:timerring
  • 2022-10-25
    山东
  • 本文字数:2221 字

    阅读完需:约 7 分钟

本文已收录于 Opencv 系列专栏: 深入浅出OpenCV ,专栏旨在详解 Python 版本的 Opencv,为计算机视觉的开发与研究打下坚实基础。免费订阅,持续更新。

图像属性

1.图像格式

图像压缩比: 通过编码器压缩后的图象数字大小和原图象数字大小的压缩比。


  • BMP 格式 Windows 系统下的标准位图格式,未经过压缩,一般图像文件会比较大。在很多软件中被广泛应用。

  • JPEG 格式也是应用最广泛的图片格式之一,它采用一种特殊的有损压缩算法,达到较大的压缩比可达到 2:1 甚至 40:1,互联网上最广泛使用的格式

  • GIF 格式不仅可以是一张静止的图片,也可以是动画,并且支持透明背景图像,适用于多种操作系统, 体型很小,网上很多小动画都是 GIF 格式。但是其色域不太广只支持 256 种颜色。

  • PNG 格式与 JPG 格式类似,压缩比高于 GIF (因此 png 损失较小,质量更好),支持图像透明支持 Alpha 通道调节图像的透明度。

  • TIFF 格式它的特点是图像格式复杂、存贮信息多。在 Mac 中广泛使用, 非常有利于原稿的复制。很多地方将 TIFF 格式用于印刷。

2.图像尺寸

图像尺寸

  • 图像尺寸的长度与宽度是以像素为单位的。

像素

  • 像素是数码影像最基本的单位,每个像素就是一个小点,而不同颜色的点聚集起来就变成一幅照片。

  • 灰度像素点数值范围在 0 到 255 之间, 0 表示黑、255 表示白,其它值表示处于黑白之间;

  • 黑白照片只需一个通道表示即可。

  • 彩色图用红、绿、蓝三通道的二维矩阵来表示。每个数值也是在 0 到 255 之间, 0 表示相应的基色,而 255 则代表相应的基色在该像素中取得最大值。

读入图像 cv2.imread()

cv2.imread()
复制代码


参数说明:


第一参数为待读路径;


第二个参数为读取方式,常见读取方式有三种



#导入opencv的python版本依赖库cv2import cv2
#使用opencv中imread函数读取图片,#0代表灰度图形式打开,1代表彩色形式打开img = cv2.imread('split.jpg',1)print(img.shape)#print(img) 打印图像的数组
复制代码

显示图像 cv2.imshow()

cv2.imshow()
复制代码


参数说明:


参数 1 :窗口的名字


参数 2 :图像数据名/变量名


#导入opencv依赖库import cv2
#读取图像,读取方式为彩色读取img = cv2.imread('split.jpg',1)#cv2.imshow('photo',img)k = cv2.waitKey(0)if k == 27: # 输入ESC键退出 cv2.destroyAllWindows()elif k == ord('s'): # 输入S键保存图片并退出 cv2.imwrite('split_.jpg',img)cv2.destroyAllWindows()
复制代码
也可 matplotlib 导入图像
#加载第三方包import cv2from matplotlib import pyplot as plt
#使用Matplotlib导入图像img = cv2.imread('test_image.png',0)plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
#隐藏X、Y轴上的刻度#plt.xticks([]), plt.yticks([])plt.show()
复制代码


键盘绑定 cv2.waitKey(0)

#cv2.waitKey()是一个键盘绑定函数#若为数字则是单位毫秒,若为0代表等待键盘输入。cv2.waitKey(0)
复制代码

删除窗口 cv2.destrovAllWindows()

# cv2.destroyAllWindows() 删除窗口# 默认值为所有窗口,参数一为待删除窗口名。cv2.destrovAllWindows()
复制代码

保存图像 cv2.imwrite()

cv2.imwrite('split_.jpg',img)
复制代码


参数说明:


参数 1 :图像名(包括格式)


参数 2 :待写入的图像数据变量名。

3.图像分辨率

  • 分辨率:单位长度中所表达或截取的像素数目。每英寸图像内的像素点数,单位是像素每英寸 (PPI) 。图像分辨率越高,像素的点密度越高,图像越清晰。

  • 通道数:图像的位深度,是指描述图像中每个 pixel 数值所占的二进制位数。 位深度 越大则图像能表示的颜色数就越多,色彩越丰富逼真。

  • 8 位:单通道图像,也就是灰度图,灰度值范围 2**8=256

  • 24 位:三通道 3*8=24

  • 32 位:三通道加透明度 Alpha 通道

灰度转化

  • 目的

  • 将三通道图像(彩色图)转化为单通道图像(灰度图)。

  • 公式

  • 3---->1: GRAY = B * 0.114 + G * 0.587 + R * 0.299

  • 1---->3: R = G = B = GRAY; A = 0

  • 函数:

  • cv2.cvtColor(img,flag)

  • 参数说明

  • 参数 1 :待转化图像

  • 参数 2 :flag 就是转换模式

  • cv2.COLOR_BGR2GRAY :彩色转灰度

  • cv2.COLOR_GRAY2BGR:单通道转三通道


#导入opencvimport cv2 #读入原始图像,使用cv2.IMREAD_UNCHANGEDimg = cv2.imread("girl.jpg",cv2.IMREAD_UNCHANGED)#查看打印图像的shapeshape = img.shapeprint(shape)#判断通道数是否为3通道或4通道if shape[2] == 3 or shape[2] == 4 :    #将彩色图转化为单通道图    img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)    cv2.imshow("gray_image",img_gray)cv2.imshow("image", img)cv2.waitKey(1000) # 等待1000毫秒也就是1秒cv2.destroyAllWindows()
复制代码

RGB 与 BGR 转化

Opencv 读取图像是以 BGR 读取的,但是许多包是 RGB 读取,因此有些情况下需要转化。


转化的方法


opencv 自带的方法转


cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
复制代码


numpy 转


img[:,:,::-1] #列左右翻转
复制代码


示例:


import cv2 import matplotlib.pyplot as plt img = cv2.imread("test2.png", cv2.IMREAD_COLOR)cv2.imshow("Opencv_win", img)# 用opencv自带的方法转img_cv_method = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 用numpy转,img[:,:,::-1]列左右翻转img_numpy_method = img[:,:,::-1] # 本来是BGR 现在逆序,变成RGB# 用matplot画图plt.subplot(1,3,1)# 划分一个1行3列的空间plt.imshow(img_cv_method)plt.subplot(1,3,2)plt.imshow(img_numpy_method)plt.subplot(1,3,3)plt.imshow(img)plt.savefig("./plt.png")plt.show()#保存图片cv2.imwrite("opencv.png", img)cv2.waitKey(0)cv2.destroyAllWindows()
复制代码



发布于: 刚刚阅读数: 3
用户头像

timerring

关注

还未添加个人签名 2022-07-14 加入

还未添加个人简介

评论

发布
暂无评论
Opencv 图像处理:图像基础操作与灰度转化_OpenCV_timerring_InfoQ写作社区