from skimage.color import rgb2gray
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import cv2
"""灰度图实现"""
# 手动灰度化
def hand_gray():
img = cv2.imread("./data/cat.jpg") # 默认是BGR模式
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转为RGB模式
# img = plt.imread("./data/cat.jpg") #plt方式读图
h, w = img.shape[:2] # 读处长和宽
img_gray = np.zeros([h, w], img.dtype) # 初始化一个和图片大小一样的0矩阵(灰度图矩阵)
for i in range(h):
for j in range(w):
m = img[i, j] # 此处m为三通道,有三个值
img_gray[i, j] = int(m[0] * 0.3 + m[1] * 0.59 + m[2] * 0.11) # 按照权值分配给灰度图矩阵赋值
print(img_gray) # 打印处理后的灰度图
cv2.imshow('hand_gray picture ', img_gray) # 展示灰度图
cv2.waitKey(0) # 让图像不会一闪而过
# 调用库函数是实现灰度化
def auto_gray():
# skimage实现灰度化
img = cv2.imread("./data/cat.jpg") # 读图
img_gray = rgb2gray(img)
cv2.imshow('skimage_gray picture ', img_gray) # 展示灰度图
print("skimage_image_gray:", img_gray) # 打印一下灰度图
cv2.waitKey(0) # 让图像不会一闪而过
plt.subplot(221) # 表示创建2*2表格,当前图显示在第一格,第一个参数代表子图的行数,第二个参数代表该行图像的列数,第三个参数代表每行的第几个图像
# 使用opencv实现灰度化
img = cv2.imread("./data/cat.jpg")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY)
# 用opencv输出
cv2.imshow('opencv_gray picture ', img_gray)
cv2.waitKey(0)
# 用plt输出:这里要注意,cmap为颜色图谱,默认为RGB(A)颜色空间,也可以指定,gray是灰度图,若cmap为其他会造成色差
plt.imshow(img_gray, cmap="gray")
plt.show()
print("opencv_image_gray:", img_gray) # 打印一下灰度图
plt.subplot(222)
if __name__ == '__main__':
# hand_gray() # 手动灰度化
auto_gray() # 调用库函数实现灰度化
手动灰度化效果
调用skimge库实现
使用opencv库实现