<button id="ssm6u"><optgroup id="ssm6u"></optgroup></button>
  • 跳轉至

    罩層摳圖

    概要

    本節課,阿凱帶大家通過罩層對彩圖進行二值化操作,最終實現摳圖與圖像拼接的功能。

    keywords 罩層 MASK 二值化 摳圖
    png

    圖像二值化

    import cv2
    
    # 載入原圖
    img = cv2.imread('cat.jpeg')
    
    from matplotlib import pyplot as plt
    
    # 展示圖像
    plt.imshow(img[:, :, ::-1])
    

    png

    # 圖像二值化
    img_bin = cv2.inRange(img, lowerb=(9, 16, 84), upperb=(255, 251, 255))
    
    plt.imshow(img_bin, cmap='gray')
    

    png

    數學形態學處理

    # 數學形態學預處理
    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')
    

    png

    篩選連通域

    # 過濾掉小的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')
    

    png

    摳圖-帶罩層的二值化與操作

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

    png

    哇, 大白貓就摳出來了

    換個背景顏色

    # 給大白貓換個背景
    background = np.zeros_like(img)
    background[:,:,:]  = (150, 198, 12)
    plt.imshow(background[:,:,::-1])
    

    png

    # 獲取新的背景
    new_background = cv2.bitwise_or(background, background, mask=cv2.bitwise_not(mask))
    plt.imshow(new_background[:,:,::-1])
    

    png

    圖片合并 cv2.add

    new_img = cv2.add(new_background, sub_img)
    plt.imshow(new_img[:,:,::-1])
    

    png

    高斯模糊

    拼接感太強,做一下高斯模糊

    # 用5*5的kernel進行高斯模糊
    new_img_blur = cv2.GaussianBlur(new_img, (9,9), 5)
    plt.imshow(new_img_blur[:,:,::-1])
    

    png

    推廣

    1Z實驗室出品 1zlab: make things easy 致力于在機器人+計算機視覺+人工智能的重疊區域, 制作小白友好的教程.

    img


    韩国精品无码一区二区三区,精品无码一区二区三区AV,欧洲丰满美熟女乱又伦AV,亚洲午夜久久久影院伊人