1. 转换为灰度图
灰度图的数据可以看成是二维数组,元素取值为0 ~ 255,其中,0为黑色,255为白色。从0到255逐渐由暗色变为亮色。
灰度图转换(ITU-R 601-2亮度变换):
L = R * 299 / 1000 + G * 587 / 1000 + B * 114 / 1000
R,G,B为最低维的数据。
显示灰度图时,需要在imshow中使用参数:
cmap="gray"
import numpy as np
import cv2
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
def get_color_channels(img):
img = img.copy()
channels_num = len(img.shape)
result = []
channels = np.split(img, channels_num, axis=2)
for i in channels:
result.append(i.sum(axis=2))
return result
# 其实没必要这么麻烦,只需要return img[:,:,0], img[:,:,1], img[:,:,2]即可
# img = cv2.imread('/home/geoffrey/图片/小熊猫.png') # opencv返回BGR,需要转换颜色通道
img = Image.open('/home/geoffrey/图片/小熊猫.jpeg')
img = np.array(img)
# img.transpose(0,1,2)
plt.imshow(img)
plt.show()
img.shape
(559, 700, 3)
分离通道
R, G, B, = get_color_channels(img)
R.shape
(559, 700)
生成白色图片,每个像素都是1.0
w = np.ones((500,500,3)) # 由于默认np.float64类型,对浮点数取比例,即1.0,对应整形255。
plt.imshow(w)
plt.show()
生成黑色图片,每个像素都是0, 方法1
w = np.zeros(shape=(500,500,3), dtype=np.uint8)
plt.imshow(w)
plt.show()
生成自定义颜色图片
w = np.full(shape=(500,500,3), fill_value=125 , dtype=np.uint8)
w[:] = [0,238,225] # 广播操作
plt.imshow(w)
plt.show()
转换为灰度图像方法1:
L = R * 299 / 1000 + G * 587 / 1000 + B * 114 / 1000
plt.imshow(L, cmap="gray")
plt.show()
转换为灰度图像方法2,点积:
temp = np.array([ 0.299, 0.587, 0.114])
plt.imshow(img@temp, cmap="gray")
plt.show()
2. 转置
plt.imshow(L.T, cmap="gray")
plt.show()
3. 画出三个通道的彩图
B_img = img.copy()
B_img[:,:, [0,1]]=0
R_img = img.copy()
R_img[:,:, [0,2]]=0
G_img = img.copy()
G_img[:,:, [2,1]]=0
fig,ax = plt.subplots(2,2)
ax[0,0].imshow(img)
ax[1,1].imshow(R_img)
ax[1,0].imshow(G_img)
ax[0,1].imshow(B_img)
fig.set_size_inches(15, 15)
plt.tight_layout()
plt.show()
4. 图像扩展
t1 = np.concatenate((img, img, img), axis=1) # 横向拼接
t2 = np.concatenate((t1, t1), axis=0)
plt.imshow(t2)
plt.show()
5. 水平镜像 --- 交换行
mirrow_img_x = img[::-1]
plt.imshow(mirrow_img_x)
plt.show()
6. 水平翻转 --- 交换列
mirrow_img_y = img[:,::-1]
plt.imshow(mirrow_img_y)
plt.show()
7. 调换x,y坐标
plt.imshow(img.transpose(1,0,2))
plt.show()
plt.imshow(img.transpose(1,0,2)[::-1])
plt.show()
8. 添加mask
k = np.random.randint(0, 256, size=(200, 200, 3), dtype=np.uint8)
test = img.copy()
test[300:500,400:600] = k
plt.imshow(test)
plt.show()
9. 随机打乱顺序
t = img.copy()
height=t.shape[0]
li = np.split(t, range(100, height, 30), axis=0)
np.random.shuffle(li)
t = np.concatenate(li, axis=0)
plt.imshow(t)
plt.show()
10. 交换通道
t = img.copy()
plt.imshow(t[:,:,[2,0,1]])
plt.show()
test = img[:, :, [2,1,0]]
plt.imshow(test)
plt.show()