一、图像读取
(1)cv2.imread()的三种读取方式
# 导入opencv的python版本依赖库cv2
import cv2
# 使用opencv中imread函数读取图片,注意读取出来的是BGR格式
img = cv2.imread("图片名.jpg", cv2.IMREAD_UNCHANGED)
print(img.shape)
# print(img) #(b,g,r)的图像数组
cv2.imshow("image", img)
k = cv2.waitKey(0) # 等待键盘输入
if k == 27:
cv2.destroyAllWindows()
elif k == ord("s"):
cv2.imwrite("gray_img.jpg", img) # 保存图片
cv2.destroyAllWindows() # 消耗所有窗口
(2)利用第三方包实现读取
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('图片名.jpg',0)
# cmap:读取图片的方式;interpolation:插值方式
plt.imshow(img, cmap="gray", interpolation="bicubic")
# plt.xticks([]), plt.yticks([]) # 隐藏x,y轴上面的刻度
plt.show()
二、彩色图和灰度图之间转换
公式:将三通道的彩色图转化为单通道的灰度图
3 ——> 1:GRAY=B*0.114 + G*0.587 + R*0.299
1 ——> 3 :B=G=R=GRAY;Alpha=0【透明度】
'''
彩色图转灰度图
'''
import cv2
img = cv2.imread("彩色图名.jpg", cv2.IMREAD_UNCHANGED) # 读取的是BGR格式彩色图
# shape = img.shape
# print(shape)
if shape[2]==3 or shape==4:
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 以灰度图的形式读取
cv2.imshow("灰度图",img_gray)
cv2.imshow("彩色图",img)
k=cv2.waitKey(0)
if k==27:
cv2.destroyAllWindows()
elif k == ord("s"):
cv2.imwrite("img_copy.jpg",img)
'''
灰度图转化彩色图
'''
import cv2
img = cv2.imread("灰度图名.jpg",cv2.IMREAD_UNCHANGED)
# shape = img.shape
# print(shape)
img_color = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) # 灰度图转彩色图
print(img_color.shape) # 多了一个通道Alpha
cv2.imshow("color_img", img_color)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、RGB和BGR之间的转化
Matplotlib中处理使用的是RGB格式,imread读取的是BGR格式,因此需要转化处理。
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('dog.jpg', cv2.IMREAD_COLOR) # 不含alpha通道
# cv2.imshow("img_bgr",img)
# BGR转为RGB
img_cv_method = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 第三方包实现
plt.subplot(1,2,1)
plt.imshow(img[:,:,::-1]) # (w,h,channel)通道反转实现BGR转RGB
plt.subplot(1,2,2)
plt.imshow(img_cv_method)
plt.savefig("./plt_dog.jpg") # 图片存储
plt.show()
cv2.waitKey(0) # 等待键盘输入
cv2.destroyAllWindows() # 销毁所有窗口
四、通道分离和通道合并
'''
通道分离
'''
import cv2
img = cv2.imread("girl.jpg",cv2.IMREAD_UNCHANGED)
cv2.imshow("unchange", img)
# 三通道分别显示==>肉眼可视化都是灰度图,轮廓是一致的,但是亮度是不一样的
b,g,r = cv2.split(img) #分离出图片的B,R,G颜色通道
cv2.imshow('bule',b)
cv2.imshow('green',g)
cv2.imshow('red',r)
cv2.waitKey(0)
cv2.destroyAllWindows()
'''
通道合并
'''
# 案列1,分开展示RGB三个通道图像情况
import cv2
import numpy as np
img = cv2.imread("girl.jpg", cv2.IMREAD_UNCHANGED)
print(img.shape[:2])
cv2.imshow("girl", img)
cv2.waitKey(0)
b, g, r = cv2.split(img)
# 创建与image相同大小的零矩阵,uint8代表0~255之间
zeros = np.zeros(img.shape[:2], dtype="uint8")
cv2.imshow("blue", cv2.merge([b, zeros, zeros]))
cv2.imshow("green", cv2.merge([zeros, g, zeros]))
cv2.imshow("red", cv2.merge([zeros, zeros, r]))
cv2.waitKey(0)
cv2.destroyAllWindows()
# 案列2,修改其中一个通道
import cv2
img = cv2.imread("girl.jpg",cv2.IMREAD_UNCHANGED)
cv2.imshow("img_original",img)
b,g,r = cv2.split(img)
# 将g通道全变为0
g[:]=0
img_merge = cv2.merge([b,g,r])
cv2.imshow('img_merge',img_merge)
cv2.waitKey(0)
cv2.destroyAllWindows()
五、图像直方图
用以表示数字图像中亮度分布的情况,绘制图像中每个亮度值的像素数。
(1)灰度直方图
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("girl.jpg", cv2.IMREAD_UNCHANGED)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转化为灰度图
plt.imshow(img_gray,cmap="gray")
# 参数说明:图像,待计算通道数,Mask这里是None,直方图分为多少份,灰度值范围
hist = cv2.calcHist([img_gray],[0],None,[256],[0,256])
plt.figure()
plt.title("Grayscale Histogram")
plt.xlabel("bins")
plt.ylabel("pixels")
plt.plot(hist)
plt.xlim([0,256])
plt.show()
(2)三通道直方图绘制
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("girl.jpg", cv2.IMREAD_UNCHANGED)
cv2.imshow("img", img)
color= ['b','g','r']
for i,color in enumerate(color):
hist = cv2.calcHist([img],[i],None,[256],[0,256])
plt.title("girl")
plt.xlabel("bins")
plt.ylabel("nums of perlex")
plt.plot(hist,color=color) # color上色
plt.xlim([0,260])
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
六、色彩空间转化
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)
cv2.imshow("hsv",hsv)
img = cv2.imread('girl.jpg',cv2.IMREAD_UNCHANGED)
cv2.imshow("img",img)
color_space_demo(img) # BGR-> GRAY-> HSV
cv2.waitKey(0)
cv2.destroyAllWindows()