函数: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)
函数:cv2.imshow()
参数说明:
#导入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() # 默认值为所有窗口,参数一为待删除窗口名
函数:cv2.imwrite()
参数说明:
目的
将三通道图像(彩色图)转化为单通道图像(灰度图);
公式
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=B∗0.114+G∗0.587+R∗0.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)
# 通道转换,三通道转换为单通道
#导入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()
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()
# 下面的程序将使用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()
上面代码中得到的三种图都是灰度图,三者之间的区别是其亮度各自不同;这里可能有一个疑惑,为什么显示的图片颜色不是绿色、蓝色、红色呢?我们需要知道,单通道的照片都是灰度图,没有办法显示其他颜色,我们将单通道转换为三通道就能显示出其对应的独特的颜色,例如红色、蓝色、绿色,也就是说需要将单通道的图片转换为三通道的图像才能输出其对应的颜色。通过下面介绍的通道合并就能知道怎么将分离后的通道显示出其蓝色、绿色、红色;
#导入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矩阵将单通道灰度图合并为多通道图片实现颜色显示。
图像直方图
图像直方图的意义:
横坐标为灰度值,从0到255之间的值,纵坐标为对应灰度值的数量;整个直角坐标系表示的图表示不同像素值的个数,最后将这些像素点的值绘制成一条曲线;图像直方图可以形象地表示图像的明暗规律。图像越黑,则位于直方图左边的曲线越高,图像越亮,位于右侧的直方图的曲线越高;
目的
直方图是对图像像素的统计分布,它统计了每个像素(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()
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()
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()