一、数字图像
1.1 数字图像概念
数字图像,又称数码图像,一幅二维图像可以由一个数组或矩阵表示。 数字图像可以理解为一个二维函数f(x,y),其中 x 和 y 是空间(平面)坐标,而在任意坐标处的值 f 称为图像在该点处的强度或灰度。
图像处理目的:
• 改善图示的信息以便人们解释;
• 为存储、传输和表示而对图像进行的处理
1.2 数字图像的应用
⚫图像处理主要研究二维图像,处理一个图像或一组图像之间的相互转换的过程,包括图像滤波,图像识别,图像分割等问题
⚫ 计算机视觉主要研究映射到单幅或多幅图像上的三维场景,从图像中提取抽象的语义信息,实现图像理解是计算机视觉的终极目标。
⚫ 人工智能在计算机视觉上的目标就是解决像素值和语义之
间关系,主要的问题有图片检测,图片识别,图片分割和图片检索。
二、图像的属性
2.1 图像格式
⚫ BMP格式:Windows系统下的标准位图格式,未经过压缩,一般图像文件会比较大。在很多软件中被广泛应用。
⚫ JPEG格式:也是应用最广泛的图片格式之一,它采用一种特殊的有损压缩算法,达到较大的压缩比(可达到2:1甚至40:1),联网上最广泛使用的格。
⚫ GIF格式:不仅可以是一张静止的图片,也可以是动画,并且支持透明背景图像,适用于多种操作系统, “体型” 很小,网上很多小动画都是GIF格式。但是其色域不太广,只支持256种颜色。
⚫ PNG格式:与JPG格式类似,压缩比高于GIF,支持图像透明, 支持Alpha通道调节图像的透明度。
⚫ TIFF格式:它的特点是图像格式复杂、存贮信息多,在Mac中广泛使用, 非常有利于原稿的复制。很多地方将TIFF格式用于印刷。
2.2 图像尺寸
图像尺寸的长度与宽度是以像素为单位的。
像素(pixel):像素是数码影像最基本的单位,每个像素就是
一个小点,而不同颜色的点聚集起来就变成一幅动人的照片。
1、灰度像素点数值范围在0到255之间, 0表示黑、255表示白,其它值表示处于黑白之间;
2、彩色图用红、绿、蓝三通道的二维矩阵来表示。每个数值也是在0到255之间, 0表示相应的基色,而255则代表相应的基色在该像素中取得最大值
3、读入图像
函数: cv2.imread()
参数说明:
第一参数为待读路径;
第二个参数为读取方式,常见读取方式有三种:
import cv2
img=cv2.imread('1.jpg',1) #1 读取图片的路径名称 2 读取的方式
print(img.shape)#打印图片的维度
4、显示图像
函数: cv2.imshow()
参数说明:
参数1:窗口的名字;
参数2:图像数据名。
cv2.imshow('image',img) #1 窗口名字 2 图像的数据名
#是一个键盘绑定函数
cv2.waitKey(0)#单位毫秒 0代表键盘输入
#默认值为所有窗口,参数一为待删除窗口名
cv2.destroyAllWindows()
5、保存图像
函数: cv2.imwrite()
参数说明:
参数1:图像名(包括格式),
参数2:待写入的图像数据变量名。
img=cv2.imread('1.jpg',1)
print(img.shape)
#显示图像
cv2.imshow('image',img) #1 窗口名字 2 图像的数据名
#是一个键盘绑定函数
k=cv2.waitKey(0)#单位毫秒 0代表键盘输入
if k==27:
#默认值为所有窗口,参数一为待删除窗口名
cv2.destroyAllWindows()
elif k==ord('s'):
#保存图像
cv2.imwrite("1.png",img) #1 图像名(包括格式) 2待写入图像的数据名
2.3 图像分辨率和通道
分辨率:单位长度中所表达或截取的像素数目。每英寸图像内的像素点数,单位是像素每英寸(PPI)。图像分辨率越高,像素的点密度越高,图像越清晰。
通道数:图像的位深度,是指描述图像中每个pixel数值所占的二进制位数。 位深度越大则图像能表示的颜色数就越多,色彩越丰富逼真。
• 8位:单通道图像,也就是灰度图,灰度值范围2**8=256
• 24位:三通道3*8=24
• 32位:三通道加透明度Alpha通道
1、灰度转化
函数:
cv2.cvtColor(img, flag)
参数说明
参数1:待转化图像;
参数2: flag就是转换模式, cv2.COLOR_BGR2GRAY:彩色转灰度 cv2.COLOR_GRAY2BGR:单通道转三通道
#灰度转化
#目的:将三通道图像(彩色图)转化为单通道图像(灰度图)
#公式:3-->1: GRAY = B * 0.114 + G * 0.587 + R * 0.299
# 1-->3: R = G = B = GRAY; A = 0
img=cv2.imread('1.jpg',cv2.IMREAD_UNCHANGED)#图像原来是什么读取出来就是什么
shape=img.shape
print(shape)
if shape[2]==3 or shape[3]==4:
img_gry=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #图像名 转化模式
cv2.imshow('gray',img_gry)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、RGB与BGR转化
img=cv2.imread('1.jpg',1)
#opencv自带的方法
img_cv=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#用numpy砖
img_np=img[:,:,::-1]
#用matplot画图
plt.subplot(1,3,1)
plt.imshow(img_cv)
plt.subplot(1,3,2)
plt.imshow(img_np)
plt.subplot(1,3,3)
plt.imshow(img)
plt.show()
3、通道分离
目的:将彩色图像,分成b、 g、 r 3个单通道图像。方便我们对BGR 三个通道分别进行操作。
函数:
cv2.split(img)
参数说明
参数1:待分离通道的图像
#显示的是b,g,r的灰度图
img=cv2.imread('1.jpg',1)
cv2.imshow('before',img)
b,g,r=cv2.split(img)
#三通道分别显示
cv2.imshow('blue',b)
cv2.imshow('green',g)
cv2.imshow('red',r)
cv2.waitKey(0)
cv2.destroyAllWindows()
#显示b,g,r个通道的颜色图片
img=cv2.imread('1.jpg',1)
cv2.imshow('before',img)
b,g,r=cv2.split(img)
#三通道分别显示
zeros=np.zeros(img.shape[:2],dtype='uint8') #创建一张与原图片大小相同的0矩阵
cv2.imshow('blue',cv2.merge([b,zeros,zeros]))
cv2.imshow('g',cv2.merge([zeros,g,zeros]))
cv2.imshow('r',cv2.merge([zeros,zeros,r]))
cv2.waitKey(0)
cv2.destroyAllWindows()
4、通道合并
通道分离为B,G,R后,对单独通道进行修改,最后将修改后的三通道合并为彩色图像。
函数: cv2.merge(List)
参数说明
参数1:待合并的通道数,以list的形式输入
img=cv2.imread('1.jpg',1)
cv2.imshow('before',img)
#调用通道分离
b,g,r=cv2.split(img)
#将b通道的数值修改为0
b[:]=0
img_m=cv2.merge([b,g,r])#参数以列表的形式进行传递
cv2.imshow('after',img_m)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.5 图像直方图
图像直方图(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。这种直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。
图像直方图的意义:
• 直方图是图像中像素强度分布的图形表达方式。
• 它统计了每一个强度值所具有的像素个数
• CV 领域常借助图像直方图来实现图像的二值化
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)的数量。
img=cv2.imread('cbl.jpg',1)
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
plt.imshow(img_gray,cmap=plt.cm.gray)
#直方图 1 待统计图像 2 待计算的通道 3 mask 4 直方图分成几份 5 灰度值范围
hist=cv2.calcHist([img],[0],None,[256],[0,256])
plt.figure()
plt.title("grayscale Histogram")
plt.xlabel("Bins")
plt.ylabel("pixels")
plt.plot(hist)
plt.xlim([0,256]) #x的刻度
plt.show()
2、三通道直方图的绘制
#三通道的彩色直方图
img=cv2.imread('cbl.jpg',1)
cv2.imshow('cbl',img)
color=('b','g','r')
#使用for循环color列表 enumerate枚举返回索引和值
for i ,color in enumerate(color):
#直方图 1 待统计图像 2 待计算的通道 3 mask 4 直方图分成几份 5 灰度值范围
hist=cv2.calcHist([img],[i],None,[256],[0,256])
plt.title("cbl")
plt.xlabel("Bins")
plt.ylabel("pixels")
plt.plot(hist,color=color)
plt.xlim([0,260]) #x的刻度
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
2.6 图像色彩空间
概念:颜色空间也称彩色模型(又称彩色空间或彩色系统)它的用途是在某些标准下用通常可接受的方式对彩色加以说明。
常见的颜色空间:RGB、 HSV、 HSI、 CMYK
1、RGB颜色空间概念
主要用于计算机图形学中,依据人眼识别的颜色创建,图像中每一个像素都具有R,G,B三个颜色分量组成,这三个分量大小均为[0,255]通常表示某个颜色的时候,写成一个3维向量的形式(110,150,130)。
颜色模型:
• 原点对应的颜色为黑色,它的三个分量值都为0;
• 距离原点最远的顶点对应的颜色为白色,三个分量值都为1;
• 从黑色到白色的灰度值分布在这两个点的连线上,该虚线称为灰度线;
• 立方体的其余各点对应不同的颜色,即三原色红、绿、蓝及其混合色黄、品红、 青色;
2、HSV颜色空间概念:
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间,这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。
颜色模型:
H通道: Hue,色调/色彩,这个通道代表颜色。
S通道: Saturation,饱和度,取值范围0%~ 100%,值越大,颜色越饱和。
V通道: Value,明暗,数值越高,越明亮, 0%(黑)到100(白)。
def color_space_demo(image):
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow("g",gray)
hsv=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
cv2.imshow('hsv',hsv)
img=cv2.imread("cbl.jpg",1)
cv2.imshow('cbl',img)
color_space_demo(img)
cv2.waitKey(0)
cv2.destroyAllWindows()
3、HSI颜色空间概念
•HSI模型是美国色彩学家孟塞尔(H.A.Munseu)于1915年提出的,它反映了人的视觉系统感知彩色的方式,以色调、饱和度和强度三种基本特征量来感知颜色。
模型优点
• 在处理彩色图像时,可仅对I分量进行处理,结果不改变原图像中的彩色种类;
•HSI模型完全反映了人感知颜色的基本属性,与人感知颜色的结果一一对应
4、CMYK颜色空间概念
CMYK(Cyan, Magenta,Yellow, blacK)颜色空间应用于印刷工业,印刷业通过青©、品(M)、黄(Y)三原色油墨的不同网点面积率的叠印来表现丰富多彩的颜色和阶调,这便是三原色的CMY颜色空间。