课程一览:
目录
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图像色彩空间
完整代码
学习目标:
图像处理、机器视觉、人工智能关系
函数:cv2.imread()
参数说明:
#导入opencv的python版本依赖库cv2
import cv2
#使用opencv中imread函数读取图片,
#0代表灰度图形式打开,1代表彩色形式打开
img = cv2.imread('split.jpg',1)
print(img.shape)
#print(img)
函数:cv2.imshow()
参数说明:
#导入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
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读取的是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
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模块
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
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()
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()
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()
(1)RGB颜色
(2)HSV颜色
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)
#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
(4)CMYK颜色
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()