1、读入图像
函数:cv2.imread(读取路径,读取方式)
常见的读取方式有三种
读取方式 | 含义 | 数字表示 |
cv2.IMREAD_COLOR | 默认值,加载一张彩色图片,忽视透明度 | 1 |
cv2.IMREAD_GRAYSCALE | 加载一张灰度图 | 0 |
cv2.IMREAD_UNCHANGED | 按照图片的原始方式加载图像,包括它的Alpha通道 | -1 |
import cv2
img=cv2.imread('test.jpg',0)
print(img.shape)
2、显示图像
函数:cv2.imshow(窗口名字,图像数据的名字)
img=cv2.imread('test.jpg',1)
cv2.imshow('image',img)
3、保存图片
函数:cv2.imwrite(图像名,待写入图片的数据变量名)
cv2.imwrite('new_img.jpg',img)
4、灰度转化
作用:将三通道图像(彩色图)转化为单通道图像(灰度图);可以在读取图片时将cv2.imread的参数设置为0或1来实现,采用下述方法可以了解转化的过程
公式:三通道转化为单通道:GRAY=B*0.114+G*0.587+R*0.229
单通道转化为三通道:R=G=B=GRAY;A=0
函数:cv2.cvtColor(img,flag)
img为要转化的图像;flag为转换模式,flag=cv2.COLOR_BGR2GRAY时表示将彩色图图转化为灰度图;flag=cv2.COLOR_GRAY2BGR时表示将灰度图转化为彩色图
import cv2
img=cv2.imread("test.jpg",cv2.IMREAD_UNCHANGED)
shape=img.shape
print(shape)
#判断通道数是否为三通道或四通道
if shape[2]==3 or shape[2]==4:
#彩色图转为灰度图
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray",img_gray)2
cv2.imshow("image",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
5、BGR与RGB的转化
opencv中读取图片默认方式为BGR,但在使用中常用RGB,因此根据需求有时需要对读取到的图片进行转化,转化方式有两种
1、用opencv自带的函数:cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
2、用numpy转,将原来的数据逆转
import cv2
import matplotlib.pyplot as plt
img=cv2.imread("test.jpg",1)
#用opencv自带的方法
img_cv_method=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#用numpy转,将列左右翻转
img_numpy_method=img[:,:,::-1]
#用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()
6、通道的分离与合并
1、通道分离
目的:将彩色图像分成b,g,r3个单通道图像,方便对每个通道进行单独操作
函数:cv2.split(img)
2、通道合并
目的:对单通道进行修改以后,再将修改后的三个通道合并为彩色图像
函数:cv2.merge(list);待合并的通道数以list的形式输入
import cv2
img=cv2.imread("test.jpg")
#调用通道分离函数
b,g,r=cv2.split(img)
#三个通道分别显示
cv2.imshow('blue',b)
cv2.imshow('red',r)
cv2.imshow('green',g)
#将b通道变为0,查看与原图的区别
b[:] = 0
#合并通道
img_merge=cv2.merge([b,g,r])
cv2.imshow('merge',img_merge)
cv2.waitKey(0)
cv2.destroyAllWindows()
通过上述代码可以发现,单通道显示的每个图片都是灰度图,并不是分别显示为红、蓝、绿,因此若想让分离后B通道的图片呈蓝色,则需要将单通道变为三通道显示,即[B,0,0]的形式
import cv2
import numpy as np
img=cv2.imread("test.jpg")
#调用通道分离函数
B,G,R=cv2.split(img)
#创建与图像大小相同的零矩阵
zeros=np.zeros(img.shape[:2],dtype="uint8")
#显示【B,0,0】
cv2.imshow("BLUE",cv2.merge([B,zeros,zeros]))
cv2.waitKey(0)
cv2.destroyAllWindows()
7、图像直方图的绘制
1、图像直方图:表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。在这种直方图中,横坐标左侧为纯黑、较暗的区域,右侧为较亮、纯白的区域。
2、目的:对图像像素的分布进行统计
3、函数:cv2.calcHist(img,channels,mask,histSizze,ranges)
img:要进行统计的图像,要用中括号括起来
channels:待计算的通道
histSize:表示直方图分为多少份
ranges:要统计的像素值的范围
from matplotlib import pyplot as plt
img=cv2.imread('test.jpg')
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
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()