OpenCV(一)——图像基础知识

课程一览:

OpenCV(一)——图像基础知识_第1张图片

目录

1.数字图像

1.1 数字图像概念

1.2 数字图像起源

1.3 常见成像方式

1.4 数字图像的应用

1.5 OpenCV介绍

2.图像属性

2.1 图像格式

2.2 图像尺寸

2.3 图像分辨率和图像通道

 2.3.1 灰度转化

 2.3.2 RGB 与BGR

 2.3.3 通道分离

 2.3.4 通道合并

2.4 图像直方图

2.4.1 直方图绘制

2.4.2 三通道直方图绘制

2.5图像色彩空间

完整代码


学习目标:

OpenCV(一)——图像基础知识_第2张图片

1.数字图像

1.1 数字图像概念

  • 数字图像
    • 数字图像又称数码图像或数位图像,是二维图像用有限数字数值像素的表示,由数组或矩阵表示。
    • 数字图像可以理解为一个二维函数f(x,y),其中x和y是空间(平面)坐标,而在任意坐标处的幅值f称为图像在该点处的强度或灰度。
  • 图像处理目的
    • 改善图示的信息以便人们解释
    • 为存储、传输和表示而对图像进行的处理

OpenCV(一)——图像基础知识_第3张图片

1.2 数字图像起源

OpenCV(一)——图像基础知识_第4张图片

1.3 常见成像方式

OpenCV(一)——图像基础知识_第5张图片

 OpenCV(一)——图像基础知识_第6张图片 OpenCV(一)——图像基础知识_第7张图片

 OpenCV(一)——图像基础知识_第8张图片OpenCV(一)——图像基础知识_第9张图片

 OpenCV(一)——图像基础知识_第10张图片OpenCV(一)——图像基础知识_第11张图片

 OpenCV(一)——图像基础知识_第12张图片OpenCV(一)——图像基础知识_第13张图片

 OpenCV(一)——图像基础知识_第14张图片OpenCV(一)——图像基础知识_第15张图片

 OpenCV(一)——图像基础知识_第16张图片OpenCV(一)——图像基础知识_第17张图片

  OpenCV(一)——图像基础知识_第18张图片OpenCV(一)——图像基础知识_第19张图片

 OpenCV(一)——图像基础知识_第20张图片

1.4数字图像的应用

图像处理、机器视觉、人工智能关系

  • 图像处理主要研究二维图像,处理一个图像或一组图像之间的相互转换的过程,包括图像滤波,图像识别,图像分割等问题。
  • 计算机视觉主要研究映射到单幅或多幅图像上的三维场景,从图像中提取抽象的语义信息,实现图像理解是计算机视觉的终极目标。
  • 人工智能在计算机视觉上的目标就是解决像素值和语义之间关系,主要的问题有图片检测,图片识别,图片分割和图片检索。

1.5 OpenCV介绍

OpenCV(一)——图像基础知识_第21张图片

2.图像属性

2.1 图像格式

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

2.2 图像尺寸

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

函数:cv2.imread()

参数说明:

  • 第一参数为待读路径
  • 第二个参数为读取方式,常见读取方式有三种

 OpenCV(一)——图像基础知识_第22张图片

 OpenCV(一)——图像基础知识_第23张图片

#导入opencv的python版本依赖库cv2
import cv2

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

函数:cv2.imshow()

参数说明:

  • 参数一,窗口的名字
  • 参数二,图像数据名

OpenCV(一)——图像基础知识_第24张图片

#导入opencv依赖库
import cv2

#读取图像,读取方式为彩色读取
img = cv2.imread('split.jpg',1)
#
cv2.imshow('photo',img)
#等待时间,若为0,则键入后退出
k = cv2.waitKey(0)
if k == 27:   # 输入ESC键退出
    cv2.destroyAllWindows()
elif k == ord('s'): # 输入S键保存图片并退出
    cv2.imwrite('split_.jpg',img)
#销毁窗口
cv2.destroyAllWindows()

函数:cv2.imwrite()

参数说明:

  • 参数一,图像名(包括格式)
  • 参数二,待写入的图像数据变量名

OpenCV(一)——图像基础知识_第25张图片

2.3 图像分辨率和图像通道

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

OpenCV(一)——图像基础知识_第26张图片

 2.3.1灰度转化

  • 目的:将三通道图像(彩色图)转化为单通道图像(灰度图)。
  • 公式:
    • 3-->1:GRAY = B * 0.114 + G * 0.587 + R * 0.299
    • 1-->3:R = G = B = GRAY; Alpha = 0
  • 函数:cv2.cvtColor(img,flag)
  • 参数说明
    • 参数一:待转化图像
    • 参数二:flag就是转换模式,
      • cv2.COLOR_BGR2GRAY:彩色转灰度
      • cv2.COLOR_GRAY2BGR:单通道转三通道

OpenCV(一)——图像基础知识_第27张图片

#导入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()

 2.3.2 RGB 与BGR

用opencv读取的是BGR的格式,如果用plt展示图片,需要将图片从BGR转为RGB格式。

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)
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()

 OpenCV(一)——图像基础知识_第28张图片

 2.3.3 通道分离

  • 目的:将彩色图像,分成B、G、R三个单色通道图像。方便我们对BGR三个通道分别进行操作。
  • 函数:cv2.split(img)
  • 参数说明
    • 参数一:待分离通道的图像
#加载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()

 输出全为三个灰度图

OpenCV(一)——图像基础知识_第29张图片

#导入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()

OpenCV(一)——图像基础知识_第30张图片

 2.3.4 通道合并

  • 目的:通道分离为B、G、R后,对单独通道进行修改,最后将修改后的三通道合并为彩色图像。
  • 函数:cv2.merge(List)
  • 参数说明
    • 参数一:待合并的通道数,以list的形式输入
#加载opencv
import cv2
src=cv2.imread('split.jpg')
cv2.imshow('before',src)
#调用通道分离
b,g,r=cv2.split(src)
#将Blue通道数值修改为0
g[:] = 0
#合并修改后的通道
img_merge=cv2.merge([b,g,r])
cv2.imshow('merge',img_merge)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV(一)——图像基础知识_第31张图片

2.4 图像直方图

  • 图像直方图:图像直方图(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。这种直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。
  • 图像直方图的意义:
    • 直方图是图像中像素强度分布的图形表达方式
    • 它统计了每一个强度值所具有的像素个数
    • CV领域常借助图像直方图来实现图像的二值化

2.4.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)的数量。

OpenCV(一)——图像基础知识_第32张图片

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()

OpenCV(一)——图像基础知识_第33张图片

 2.4.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()

OpenCV(一)——图像基础知识_第34张图片 OpenCV(一)——图像基础知识_第35张图片

2.5图像色彩空间

  • 概念
    • 颜色空间也称为彩色模型(又称彩色空间或彩色系统),它的用途是在某些标准下用通常可接受的方式对彩色加以说明。
  • 常见的颜色空间:RGB、HSV、HSI、CMYK

(1)RGB颜色

  • RGB颜色空间概念
    • 主要用于计算机图形学中,依据人眼识别的颜色创建,图像中每一个像素都具有R、G、B三个颜色分量组成,这三个分量大小均为[0,255]。通常表示某个颜色的时候,写成一个三维向量的形式(110,150,130)。
  • 颜色模型
    • 原点对应的颜色为黑点,它的三个分量值都为0
    • 距离原点最远的顶点对应的颜色为白色,三个分量值都为1
    • 从黑色到白色的灰度值分布在这两个点的连线上,该虚线称为灰度线
    • 立方体的其余各点对应不同的颜色,即三原色红、绿、蓝及其混合色黄、品红、青色。

OpenCV(一)——图像基础知识_第36张图片

 (2)HSV颜色

  • HSV颜色空间概念
    • HSV(Hue,Saturation,Value)是根据颜色的直观特性由A.R.Smith在1978年创建的一种颜色空间,这个模型中颜色的参数分别是:色调(H)、饱和度(S)、明度(V)。
  • 颜色模型
    • H通道:Hue,色调/色彩,这个通道代表颜色
    • S通道:Saturation,饱和度,取值范围0%~100%,值越大,颜色越饱和
    • V通道:Value,明暗,数值越高,越明亮,0%(黑)到100%(白)

OpenCV(一)——图像基础知识_第37张图片

RGB转HSV

OpenCV(一)——图像基础知识_第38张图片

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)
    #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()

(3)HSI

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

OpenCV(一)——图像基础知识_第39张图片

 (4)CMYK颜色

  • CMYK颜色空间概念
    • CMYK颜色空间应用于印刷工业,印刷业通过青(C)、品(M)、黄(Y)三原色油墨的不同网点面积率的叠印来表现丰富多彩的颜色和阶调,这便是三原色的CMY颜色空间。

OpenCV(一)——图像基础知识_第40张图片

完整代码

import cv2
from matplotlib import pyplot as plt
import numpy as np

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

#=============================cv2.imshow显示图片==========================#
#=============================cv2.imwrite保存图片==========================#
flag = 0
# flag = 1
if flag == 1:
    #读取彩色图片
    img = cv2.imread('girl.jpg', 1)
    #窗口名和图片参数
    cv2.imshow('girl',img)

    # 等待时间,若为0,则键入任意键后退出
    key = cv2.waitKey(0)
    #根据指示键入,操作完后退出
    if key == 27:    # 输入ESC键退出
        #imshow会在桌面创建一个临时地址,使用完后需手动销毁窗口
        cv2.destroyAllWindows()
    elif key == ord('s'):   # 输入S键保存图片并退出
        #保存图片:图片地址及图片名,图片参数
        #注意,图片名要加扩展名,否则报错
        #文件保存位置与该文件同级
        cv2.imwrite('save_girl.jpg',img)
    cv2.destroyAllWindows()

#=============================cv2.cvtColor实现三通道图与单通道灰度图的相互转化==========================#

flag = 0
# flag = 1
if flag == 1:
    #-1表示不对图片做改变
    img = cv2.imread('girl.jpg',-1)
    #获取图片的shape
    shape = img.shape
    ##判断通道数是否为3通道或4通道
    if shape[2] == 3 or shape[2] == 4:
        # 将彩色图转化为单通道图
        img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        cv2.imshow('girl_gray',img_gray)
    cv2.imshow('girl',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


flag = 0
# flag = 1
if flag == 1:
    img_gray = cv2.imread('girl_gray.jpg',-1)
    shape = img_gray.shape
    #单通道灰度图转为三通道
    img = cv2.cvtColor(img_gray,cv2.COLOR_GRAY2BGR)
    #虽然转为了三通道,单输出的结果仍是灰度图
    cv2.imshow('img',img)
    cv2.imshow('img_gray',img_gray)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

#=============================BGR与RGB之间的转换==========================#

flag = 0
# flag = 1
if flag == 1:
    #用cv读取BGR图像
    img = cv2.imread('test_image.png', 0)
    #用matplotlib展示RGB图片,gray为灰度图
    plt.imshow(img)

    # 隐藏X、Y轴上的刻度
    plt.xticks([])
    plt.yticks([])
    plt.show()


flag = 0
# flag = 1
if flag == 1:
    '''
        由于cv读入的是BGR图像,matplotlib输出的RGB图像,则输出的图像色彩与原图不符
        所以需要在plt.imshow之前对图片的通道进行变换:BGR-->RGB
    '''
    img_BGR = cv2.imread('girl.jpg',-1)
    #通过opencv自带的方法转换
    img_cv_RGB = cv2.cvtColor(img_BGR,cv2.COLOR_BGR2RGB)
    #用numpy转,将img[:,:,::-1]列左右翻转
    img_numpy_RGB = img_BGR[:, :, ::-1]

    #用matplotlib画图
    #定义行列,(1,3)表示一行三列的窗口,最后一个1表示第一个图像
    plt.subplot(1,3,1)
    plt.imshow(img_BGR)
    plt.subplot(1,3,2)
    plt.imshow(img_cv_RGB)
    plt.subplot(1,3,3)
    plt.imshow(img_numpy_RGB)
    #用plt显示图像不用手动销毁窗口
    plt.show()

#=============================使用split对BGR通道分离==========================#
flag = 0
# flag = 1
if flag == 1:
    '''
    可以看到,输出结果为三张不同深度的灰度图,分离后每张图片都是单通道的,仅有一个值来表示,而彩图需要是三个以上个通道
    '''
    img = cv2.imread('girl.jpg',-1)
    #分离通道
    b,g,r = cv2.split(img)
    #显示分离后的各通道
    cv2.imshow('blue',b)
    cv2.imshow('green',g)
    cv2.imshow('red',r)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

#=============================手动通道分离==========================#
flag = 0
# flag = 1
if flag == 1:
    img = cv2.imread('girl.jpg', -1)
    # 分离通道
    b, g, r = cv2.split(img)
    #创建与img相同的二维零矩阵
    zero = np.zeros(img.shape[:2],dtype='uint8')
    #cv2.merge用于合并通道
    cv2.imshow('blue',cv2.merge([b,zero,zero]))     #显示 (B,0,0)图像
    cv2.imshow('green', cv2.merge([zero, g , zero]))    #显示(0,G,0)图像
    cv2.imshow('red', cv2.merge([zero, zero, r]))   #显示(0,0,R)图像
    cv2.waitKey(0)
    cv2.destroyAllWindows()

#=============================绘制灰度直方图==========================#
flag = 0
# flag = 1
if flag == 1:
    img = cv2.imread('girl.jpg',-1)
    img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    #绘制直方图,参数分别为img、通道、mask、份数、灰度值范围
    #方括号必须要加上哦
    hist = cv2.calcHist([img],[0],None,[256],[0,256])

    #创建画布,可以自定义大小,figsize = ?
    plt.figure('gray_hist')
    #画布名称
    plt.title('gray_hist')
    plt.xlabel('grayhist')
    plt.ylabel('pixel')
    plt.plot(hist)
    plt.xlim([0,256])
    plt.show()


# flag = 0
flag = 1
if flag == 1:
    img = cv2.imread('girl.jpg',-1)
    # girl.ravel()函数是将图像的三位数组降到一维上去,
    # 256为bins的数目,[0, 256]为范围
    plt.hist(img.ravel(),256,[0,256])
    plt.show()

#=============================绘制三通道直方图==========================#
flag = 0
# flag = 1
if flag == 1:
    img = cv2.imread('girl.jpg',-1)
    color = ('b','g','r')
    # 使用for循环遍历color列表,enumerate枚举返回索引和值
    for i , color in enumerate(color):
        hist = cv2.calcHist([img],[i],None,[256],[0,256])
        plt.title('gray_hist')
        plt.xlabel('grayhist')
        plt.ylabel('pixel')
        plt.plot(hist,color = color)
        plt.xlim([0, 256])

    plt.show()

你可能感兴趣的:(OpenCV基础知识,深度学习)