一、圖片處理
目錄
- 一、圖片處理
- 讀取圖片與顯示圖片
- 編輯與保存圖片
- 截取部分圖片
- 圖片通道分離與合并
- 顏色模式變換
- 圖片相加
- 將圖片保存到記憶體中(PIL)
import cv2 # pip install opencv-python 倉庫地址:https://github.com/opencv/opencv-python
import matplotlib.pyplot as plt
def to_plt_color(img):
# 通過次函式將cv2 與 plt 顏色對應上
img_cp = img.copy()
return img_cp[...,(2,1,0)]
def cv_img_show(img, title=""):
# 由于 jupyter notebook 調不了 cv2.imshow() 于是我使用用了 matplotlib.pyplot 包來顯示圖片, 并且將cv2 的顏色與 matplotlib對應上
if title:
plt.title(title)
plt.imshow(to_plt_color(img))
plt.show()
讀取圖片與顯示圖片
# 讀取圖片檔案
img = cv2.imread("nikou.jpg") # numpy.ndarray
print(type(img))
print(img.shape) # 高,寬, BGR (0-255) 注意顏色通道順序, 與matlabplot 的順序不一樣
<class 'numpy.ndarray'>
(1044, 1200, 3)
#### 顯示圖片
# cv2.imshow("", img)
cv_img_show(img) # 由于 jupyter notebook 調不了 cv2.imshow() 于是我使用用了 matplotlib.pyplot 包來顯示圖片

編輯與保存圖片
cv2.imwrite(path, img) 保存圖片
### 編輯圖片
img_cp = img.copy()
def save_channel(img, channel=0):
img = img.copy()
for i in range(img.shape[-1]):
if i != channel:
img[..., i] = 0 # numpy.ndarray 直接按照索引修改像素點為0
cv2.imwrite(f"channel{channel}.jpg", img) # 保存圖片
plt.title(f"channel_{channel}") # 顯示圖片
plt.imshow(to_plt_color(img))
plt.show()
for i in range(img_cp.shape[-1]):
save_channel(img_cp, channel=i)



截取部分圖片
img_part = img.copy()[0:400, 400:800, :] # 截圖部分圖片
cv_img_show(img_part)
print(img_part.shape)

(400, 400, 3)
圖片通道分離與合并
cv2.split() 通道分離
cv2.merge() 通道合并
## 為了方便識別是哪個通道,所以先做個標記
def mark_channel(img):
l = 200
h = int(l / 2)
for i in range(3):
img[i * l: i * l + h, 0:200, i] = 255 # 標記通道
img_cp = img.copy()
mark_channel(img_cp)
blue, green, red = cv2.split(img_cp) # 分離通道,順序是b,g,r
print(type(blue))
print(blue.shape) # 維度下降, 變為單通道
<class 'numpy.ndarray'>
(1044, 1200)
img_cp = img.copy()
mark_channel(img_cp)
cv_img_show(img_cp)
plt.imshow(blue, cmap='gray')
plt.show()
plt.imshow(green, cmap="gray")
plt.show()
plt.imshow(red, cmap="gray")
plt.show()




img_merge = cv2.merge([blue,green, red])
cv_img_show(img_merge)

顏色模式變換
顏色模式變換:cv2.COLOR_BGR2GRAY: BGR模式變成灰度, cv2.COLOR_BGR2RGB: BGR變成 RGB 其他如 CMYK Lab模式也有對應轉換
# 彩色變成灰度圖
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 也可以變成其他顏色模式, 更改第二個引數即可
print(img_gray.shape) # 維度下降,變成二維灰度圖
(1044, 1200)
plt.imshow(img_gray, cmap="gray")
<matplotlib.image.AxesImage at 0x23024ed6760>

# 將 BGR 顏色變成 RGB
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# plt.figure()
plt.subplot(1,2,1)
plt.imshow(img)
plt.subplot(1,2,2)
plt.imshow(img_rgb)
plt.show()

圖片相加
"""
cv2.copyMakeBorder(img, top, bottom, left, right, border_type, value=None)
引數:
img: numpy.ndarray
top,bottom,left,right: 上下左右邊界寬度,單位為像素值
border_type:
cv2.BORDER_CONSTANT, 帶顏色的邊界,需要傳入另外一個顏色值
cv2.BORDER_REFLECT, 邊緣元素的鏡像反射做為邊界
cv2.BORDER_REFLECT_101/cv2.BORDER_DEFAULT
cv2.BORDER_REPLICATE, 邊緣元素的復制做為邊界
CV2.BORDER_WRAP
value: borderType為cv2.BORDER_CONSTANT時,傳入的邊界顏色值,如[0,255,0]
"""
img2 = cv2.imread("mumu.jpg")
#img = cv2.cvtColor(img2,cv.COLOR_BGR2RGB)
print(img2.shape)
# img2 = cv2.resize(img2, img.shape[:2][::-1])
# 給圖片增加邊框
img2 = cv2.copyMakeBorder(img2, 500, 0,10,900, borderType=cv2.BORDER_CONSTANT, value=(0,0,0)) # top,bottom,left,right: 上下左右邊界寬度,單位為像素值
img2 =cv2.resize(img2, img.shape[:2][::-1]) # 圖片長寬變換,使 shape一致
print(img2.shape)
cv_img_show(img2)
(523, 320, 3)
(1044, 1200, 3)

img_add = cv2.add(img, img2) # 必須相同 shape才能相加, 當顏色值相加大于255時,賦值為 255
cv_img_show(img_add)

img.shape
(1044, 1200, 3)
img3 = cv2.imread("mumu2.jpg")
img3 = cv2.resize(img3, img.shape[:2][::-1])
cv_img_show(img3)
img_merge = cv2.add(img3, img)
cv_img_show(img_merge)


cv2.imwrite("merge.jpg",img_merge)
True
將圖片保存到記憶體中(PIL)
某些應用場景需要序列化或者發送圖片,如果將處理好的圖片,先保存到硬碟,然后再讀取二進制內容,這中方式速度慢,可以使用PIL直接寫到BytesIO,免去磁盤IO,
import io
from PIL import Image
with io.BytesIO() as f:
img_pil = Image.fromarray(cv2.cvtColor(img_merge, cv2.COLOR_BGR2RGB))
img_pil.save(f, "JPEG")
# cv2.imwrite(f, img,cv2.IMWRITE_JPEG_QUALITY)
data = f.getvalue()
print(type(data))
print(data[:10])
with open("pil_save.jpg", "wb") as f:
f.write(data)
<class 'bytes'>
b'\xff\xd8\xff\xe0\x00\x10JFIF'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/357216.html
標籤:其他
上一篇:論文筆記:Adaptive event detection for Representative Load Signature Extraction
