图像基础知识 —— 图像属性

1、图像格式

  • BMP格式
    • Windows系统下的标准位图格式,未经压缩,一般图像文件会比较大,在很多软件中被广泛使用;
  • JPEG格式
    • 应用最广泛的图片格式之一,它采用一种特殊的有损压缩方法,达到较大的压缩比(可到2:1甚至40:1),互联网上最广泛使用的格式;
  • GIF格式
    • 不仅可以是一张静止的图片,也可以是动画,并且支持透明背景图像,适用于多种操作系统,“体型”很小,网上很多小动画都是GIF格式,但是其色域不太广,只支持256种颜色;
  • PNG格式
    • 与JPG格式类似,压缩比高于GIF,支持图像透明,支持Alpha通道调节图像的透明度;
  • TIFF格式
    • 它的特点是图像格式复杂,储存信息多,在Mac中广泛使用,非常有利于原稿的复制,在很多地方将TIFF格式用于印刷;

2、图像尺寸

  • 图像尺寸
    • 图像尺寸的长度与宽度是以像素为单位的;
  • 像素
    • 像素是数码影像中最基本的单位,每个像素就是一个小点,而不同颜色的点聚集起来就编程一幅动人的照片;
    • 灰度像素点数值范围在0到255之间,0表示黑,255表示白,其它值表示处于黑白之间;
    • 彩色图用红、绿、蓝三通道的二维矩阵来表示。每个数值也是在0到255之间,0表示相应的基色,而255表示相应的基色在该像素中取得最大值;

2.1 读入图像

函数:cv2.imread()
参数说明:

  • 第一参数为待读路径;
  • 第二个参数为读取方式,常见读取方式有三种:
读取方式 含义 数字表示
cv2.IMREAD_COLOR 默认值,加载一张彩色图片,忽视透明度 1
cv2.IMREAD_GRAYSCALE 加载一张灰度图 0
cv2.IMREAD_UNCHANGED 加载图像,包括它的Alpha通道 -1
# 导入opencv的Python版本依赖库cv2
import cv2

# 使用opencv中imread函数读取图片
# 0表示灰度图形式打开,1代表彩色图形式打开
img = cv2.imread('messi5.jpg',0)
print(img.shape)

2.2 显示图像

函数:cv2.imshow()
参数说明:

  • 参数1:窗口的名字;
  • 参数2:图像数据名;
#导入opencv依赖库
import cv2

#读取图像,读取方式为彩色读取
img = cv2.imread('split.jpg',1)

# 'photo'为窗口名字,img为数组变量名
cv2.imshow('photo',img)

# cv2.waitkey()是一个键盘绑定函数
k = cv2.waitKey(0)  # 0表示等待键盘输入,如果不是0则表示等待时间,单位为毫秒

if k == 27:   # 输入ESC键退出
    cv2.destroyAllWindows()  # 删除窗口
elif k == ord('s'): # 输入S键保存图片并退出
    cv2.imwrite('split_.jpg',img)  # 第一个参数为存储路径,第二个参数为要保存的图像
cv2.destroyAllWindows()  # 默认值为所有窗口,参数一为待删除窗口名

2.3 保存图像

函数:cv2.imwrite()
参数说明:

  • 参数1:保存路径及图像名(包括格式);
  • 参数2:待写入的图像数据变量名;

3、图像分辨率和通道数

  • 分辨率
    • 单位长度中所表达或截取的像素数目,每英寸图像内的像素点数,单位是像素每英寸(PPI)。图像分辨率越高,像素的点密度越高,图像越清晰;
  • 通道数
    • 图像的位深度,是指描述图像中每个pixel数值所占的二进制位数。位深度越大则图像能表示的颜色数就越多,色彩越丰富逼真;
    • 8位:单通道图像,也就是灰度图,灰度值范围为 2 ∗ ∗ 8 = 256 2**8=256 28=256
    • 24位:三通道 3 ∗ 8 = 24 3*8=24 38=24,每个通道用8比特进行存储;
    • 32位:三通道加透明度Alpha通道

3.1 灰度转化

  • 目的

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

  • 公式

    3 − > 1 : G R A Y = B ∗ 0.114 + G ∗ 0.587 + R ∗ 0.299 3->1:GRAY=B*0.114+G*0.587+R*0.299 3>1:GRAY=B0.114+G0.587+R0.299
    1 − > 3 : R = G = B = G R A Y ; A = 0 1->3:R=G=B=GRAY;A=0 1>3:R=G=B=GRAY;A=0

  • 函数

    cv2.cvtColor(img,flag)

    • 参数说明
      参数1:待转化图像;
      参数2:flag就是转换模式,cv2.COLOR_RGB2GRAY:彩色转灰度;cv2.COLOR_GRAY2RGB:单通道转三通道;
# 通道转换,三通道转换为单通道
#导入opencv
import cv2 
#读入原始图像,使用cv2.IMREAD_UNCHANGED
img = cv2.imread("girl.jpg",cv2.IMREAD_UNCHANGED)
#查看打印图像的shape
shape = img.shape
print(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)
cv2.destroyAllWindows()
# 通道转换,单通道转为三通道
#导入opencv
import cv2 
#读入灰度图
img = cv2.imread("girl_gray.jpg",cv2.IMREAD_UNCHANGED)
#查看打印图像的shape
shape = img.shape
print(shape)
img_color = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
print(img_color.shape)
cv2.imshow("color_image",img_color)
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.2 RGB和BGR的转换

OPencv读取图像的时候是以BGR的形式读取的,但是很多包是以RGB的形式读取的,所以存在两者之间的相互转化问题,如果不进行转化,则两者之间形式会存在偏差,有两种方法进行RGB和BGR的转化。

第一种方法是OPencv中的函数cv2.cvtColor,第二种方法是Python中的矩阵维度转换;

# 下面的程序将使用opencv加载一个彩色图,然后将其转换为BGR数据,并使用Matplotlib显示出来
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,2,1)
plt.imshow(img_cv_method)
plt.subplot(1,2,2)
plt.imshow(img_numpy_method)
plt.savefig("./plt.png")
plt.show()
#保存图片
cv2.imwrite("opencv.png", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.3 通道分离

  • 目的
    将彩色图像,分为b、g、r三个单通道图像,方便我们对BGR三个通道分别进行操作;、
    对BGR三个通道分别进行操作;
  • 函数
    cv2.split(img)
  • 参数说明:
    参数1:待分离的通道的图像;
# 下面的程序将使用opencv加载一张彩色图,然后将其R、G、B三通道分离并显示
#加载opencv
import cv2
src=cv2.imread('split.jpg')
cv2.imshow('before',src)
#调用通道分离
b,g,r=cv2.split(src)
#三通道分别显示
cv2.imshow('blue',b)
cv2.imshow('green',g)
cv2.imshow('red',r)
cv2.waitKey(0)
cv2.destroyAllWindows()

上面代码中得到的三种图都是灰度图,三者之间的区别是其亮度各自不同;这里可能有一个疑惑,为什么显示的图片颜色不是绿色、蓝色、红色呢?我们需要知道,单通道的照片都是灰度图,没有办法显示其他颜色,我们将单通道转换为三通道就能显示出其对应的独特的颜色,例如红色、蓝色、绿色,也就是说需要将单通道的图片转换为三通道的图像才能输出其对应的颜色。通过下面介绍的通道合并就能知道怎么将分离后的通道显示出其蓝色、绿色、红色;

3.4 通道合并

  • 目的
    通道分类为B/G/R后,对单独通道进行修改,最后将修改后的三通道合并为彩色图像;
  • 函数:
    cv2.merge(List)
  • 参数说明:
    参数1:待合并的通道数,以List的形式输入;
#导入opencv模块
import numpy as np
import cv2            
 
image=cv2.imread("split.jpg")#读取要处理的图片
cv2.imshow("src",image)
cv2.waitKey(0)
B,G,R = cv2.split(image)#分离出图片的B,R,G颜色通道

zeros = np.zeros(image.shape[:2],dtype="uint8")#创建与image相同大小的零矩阵
cv2.imshow("BLUE",cv2.merge([B,zeros,zeros]))#显示 (B,0,0)图像
cv2.imshow("GREEN",cv2.merge([zeros,G,zeros]))#显示(0,G,0)图像
cv2.imshow("RED",cv2.merge([zeros,zeros,R]))#显示(0,0,R)图像
cv2.waitKey(0)
cv2.destroyAllWindows()

上述代码将多通道图片分离为三通道后,通过添加0矩阵将单通道灰度图合并为多通道图片实现颜色显示。

图像基础知识 —— 图像属性_第1张图片

3.5 图像直方图

  • 图像直方图

    • 图像直方图是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数,这种直方图,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域;
  • 图像直方图的意义:

    • 直方图是图像中像素强度分布的图形表达方式;
    • 它统计了每一个强度值所具有的像素个数;
    • CV领域常借助图像直方图来实现图像的二值化;

图像基础知识 —— 图像属性_第2张图片
横坐标为灰度值,从0到255之间的值,纵坐标为对应灰度值的数量;整个直角坐标系表示的图表示不同像素值的个数,最后将这些像素点的值绘制成一条曲线;图像直方图可以形象地表示图像的明暗规律。图像越黑,则位于直方图左边的曲线越高,图像越亮,位于右侧的直方图的曲线越高;

3.5.1 直方图绘制

  • 目的
    直方图是对图像像素的统计分布,它统计了每个像素(0到255)的数量;

  • 函数:
    cv2.calcHist(images,channels,mask,histSize,ranges)

  • 参数说明:
    参数1:待统计图像,需要用中括号括起来;
    参数2:待计算的通道;
    参数3:mask,这里没有使用,所以用None;
    参数4:histSize,表示直方图分成多少份;、
    参数5:是表示直方图中各个像素的值。[0.0,256.0]表示直方图能够表示像素值从0.0到256的像素。直方图是对图像像素的统计分布,它统计了每个像素(0到255)的数量;

from matplotlib import pyplot as plt
import cv2
import numpy as np
img = cv2.imread('girl.jpg')  # 读取图像
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 将图像转换为灰度图

plt.imshow(img_gray, cmap=plt.cm.gray)
hist = cv2.calcHist([img], [0], None, [256], [0, 256])  # 统计图像中不同像素的数量并绘制直方图


plt.figure()
plt.title("Grayscale Histogram")
plt.xlabel("Bins")
plt.ylabel("# of Pixels")
plt.plot(hist)
plt.xlim([0, 256])
plt.show()

图像基础知识 —— 图像属性_第3张图片

3.5.2 三通道直方图绘制

from matplotlib import pyplot as plt
import cv2
girl = cv2.imread("girl.jpg")  # 读取文件
cv2.imshow("girl", girl)  # 显示图像
color = ("b", "g", "r")  # 三个通道
#使用for循环遍历color列表,enumerate枚举返回索引和值
for i, color in enumerate(color):  # 遍历每个通道
    hist = cv2.calcHist([girl], [i], None, [256], [0, 256])  # 对应通道绘制直方图
    plt.title("girl")
    plt.xlabel("Bins")
    plt.ylabel("num of perlex")
    plt.plot(hist, color = color)
    plt.xlim([0, 260])
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

图像基础知识 —— 图像属性_第4张图片

图像基础知识 —— 图像属性_第5张图片

3.6 颜色空间

  • 概念
    • 颜色空间也称彩色模型(又称彩色空间或者彩色系统),它的用途是在某种标准下用通常可接受的方法对彩色加以说明;
  • 常见的颜色空间
    • RGB、HSV、HSI、CMYK;
  • RGB颜色空间概念
    • 主要用于计算机图形学中,依据人眼识别的颜色创建,图像中每一个像素都具有R、G、B三个颜色分量组成,这三个分量大小均为[0,255]。通常表示某个颜色的时候,写成一个3维向量的形式;
  • 颜色模型
    • 原点对应的颜色是黑色,它的三个分量值都为0;
    • 距离原点最远的顶点对应的颜色是白色,三个分量值都为1;
    • 从黑色到白色的灰度值分布在这两个点的连线上,该虚线称为灰度线;
    • 立方体的其余各点对应不同的颜色,即三原色红、绿、蓝及其混合色黄、品红、青色;

图像基础知识 —— 图像属性_第6张图片

  • HSV颜色空间概念

    • HSV(Hue,Saturation,Value)是根据颜色的直观特性由A.R.Smith在1978年创建的一种颜色空间,这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V);
  • 颜色模型

    • H通道:Hue,色调/色彩,这个通道代表颜色;
    • S通道:Saturation,饱和度,取值范围0%~100%,值越大,颜色越饱和;
    • V通道:Value,明暗,数值越高,越明亮,0%(黑)到100%(白);

    图像基础知识 —— 图像属性_第7张图片

如上图,零度表示红色,一百二十度表示绿色,二百四十度表示蓝色;

3.6.1 RGB空间与HSV转化

import cv2
#色彩空间转换函数
def color_space_demo(image):
    gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)  # 转换为灰度图
    cv2.imshow('gray',gray)
    hsv=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)  # 转换为HSV图
    #print(hsv)
    cv2.imshow('hsv',hsv)
#读入一张彩色图
src=cv2.imread('girl.jpg')
cv2.imshow('before',src)
#调用color_space_demo函数进行色彩空间转化
color_space_demo(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

  • HSI颜色空间概念
    • HSI模型是美国色彩学家孟塞尔(H.A.Munseu)于1915年提出的,它反映了人的视觉系统感知彩色的方式,以色调、饱和度和强度三种基本特征量来感知颜色;
  • 模型优点
    • 在处理彩色图像时,可仅对I分量进行处理,结果不改变原图像中的彩色种类;
    • HSI模型完全反映了人感知颜色的基本属性,与人感知颜色的结果一一对应;

图像基础知识 —— 图像属性_第8张图片

  • CMYK颜色空间概念
    • CMYK(Cyan,Magenta,Tellow,Black)颜色空间应用于印刷工作,印刷业通过青©、品(M)、黄(Y)三原色油墨的不同网点面积率的叠印来表现丰富多彩的颜色和阶调,这便是三原色的CMY颜色空间;
      图像基础知识 —— 图像属性_第9张图片

你可能感兴趣的:(计算机视觉)