罩層摳圖¶
概要¶
本節課,阿凱帶大家通過罩層對彩圖進行二值化操作,最終實現摳圖與圖像拼接的功能。
keywords 罩層 MASK 二值化 摳圖
圖像二值化¶
import cv2
# 載入原圖 img = cv2.imread('cat.jpeg')
from matplotlib import pyplot as plt
# 展示圖像 plt.imshow(img[:, :, ::-1])
# 圖像二值化 img_bin = cv2.inRange(img, lowerb=(9, 16, 84), upperb=(255, 251, 255))
plt.imshow(img_bin, cmap='gray')
數學形態學處理¶
# 數學形態學預處理 import numpy as np kernel = np.ones((5,5), np.uint8) img_bin = cv2.erode(img_bin, kernel, iterations=1) img_bin = cv2.dilate(img_bin, kernel, iterations=2) plt.imshow(img_bin, cmap='gray')
篩選連通域¶
# 過濾掉小的contours # 獲取邊緣信息 _, contours, hierarchy = cv2.findContours(image=img_bin,mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_SIMPLE) def contours_area(cnt): # 計算countour的面積 (x, y, w, h) = cv2.boundingRect(cnt) return w * h # 獲取面積最大的contour max_cnt = max(contours, key=lambda cnt: contours_area(cnt))
# 創建空白畫布 mask = np.zeros_like(img_bin) # 獲取面積最大的 contours mask = cv2.drawContours(mask,[max_cnt],0,255,-1) # 打印罩層 plt.imshow(mask, cmap='gray')
摳圖-帶罩層的二值化與操作¶
img跟它本身進行或/與操作(其實他們的結果是一樣的) 在罩層區域(MASK)內進行。
罩層區域為0, 黑色。
二值化操作就是 如果兩個img的該點的像素點都不為零則保留原來的取值,否則就是黑色。
# 使用罩層對原來的圖像進行摳圖 sub_img = cv2.bitwise_or(img,img,mask=mask) # sub_img = cv2.bitwise_and(img,img,mask=mask) plt.imshow(sub_img[:,:,::-1])
哇, 大白貓就摳出來了
換個背景顏色¶
# 給大白貓換個背景 background = np.zeros_like(img) background[:,:,:] = (150, 198, 12) plt.imshow(background[:,:,::-1])
# 獲取新的背景 new_background = cv2.bitwise_or(background, background, mask=cv2.bitwise_not(mask)) plt.imshow(new_background[:,:,::-1])
圖片合并 cv2.add¶
new_img = cv2.add(new_background, sub_img) plt.imshow(new_img[:,:,::-1])
高斯模糊¶
拼接感太強,做一下高斯模糊
# 用5*5的kernel進行高斯模糊 new_img_blur = cv2.GaussianBlur(new_img, (9,9), 5) plt.imshow(new_img_blur[:,:,::-1])
推廣¶
1Z實驗室出品 1zlab: make things easy 致力于在機器人+計算機視覺+人工智能的重疊區域, 制作小白友好的教程.