numpy 用於圖像處理


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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM