➣ Reading Time: 11 minutes

先來看看今天的結果圖

https://ithelp.ithome.com.tw/upload/images/20201004/20120424p2RmQg7Qld.png

-> 此篇文章的程式碼 github

Day22_p圖_merge_two_images.ipynb

前言

我們該來運用之前學過的所有東西了!
綜合運用篇就是來一次運用前面的所學!

用 OpenCV 來P圖囉!

我們準備了之前的貓貓(img1):

https://ithelp.ithome.com.tw/upload/images/20201004/20120424QI6HOGR43O.png

以及迷你版的我本人(img2):

https://ithelp.ithome.com.tw/upload/images/20201004/20120424yk6aDp2Xqn.png

來練習把我P到貓貓圖上面吧!

這裡我們先提供大家等等步驟的思路:

  1. 將要P的圖,改成適當大小 (cv2.resize)
  2. 將要P的圖,使用漫水填充法,濾出背景 (cv2.floodFill)
  3. 將濾出背景的圖,挖出人物,取得遮罩(黑色) (cv2.cvtColor, cv2.threshold)
  4. 將遮罩印在原來的圖片上,有點像挖空的感覺 (cv2.bitwise_and)
  5. 挖空後,反向取得原先要P圖的人物 (cv2.bitwise_not, cv2.bitwise_and)
  6. 合併人物至原來的圖片 (cv2.add)

將要P的圖,改成適當大小 (cv2.resize)

def resize_img(img, scale_percent=25):

    width = int(img.shape[1] * scale_percent / 100) # 縮放後圖片寬度
    height = int(img.shape[0] * scale_percent / 100) # 縮放後圖片高度
    dim = (width, height) # 圖片形狀 
    resize_img = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)  

    return resize_img

因為原來的我圖片太大了,我們先將這張圖片縮小25%。

https://ithelp.ithome.com.tw/upload/images/20201004/201204246Z83bkEWc8.png

將要P的圖,使用漫水填充法,濾出背景 (cv2.floodFill)

copyIma = img2.copy()
h, w = img2.shape[:2]
mask = np.zeros([h+2, w+2], np.uint8)
cv2.floodFill(copyIma, mask, (30, 30), (255, 255, 255), (100, 100, 100), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)  

這部分的內容可以參考昨天我所寫的:
【沒錢ps,我用OpenCV!】Day 21 – 花式修圖3,OpenCV 也有 photoshop 的魔術棒工具?! 漫水填充法 cv2.floodFill (Magic Wand Tool)

https://ithelp.ithome.com.tw/upload/images/20201004/20120424ujwiG5m0Yd.png

將濾出背景的圖,挖出人物,取得遮罩(黑色) (cv2.cvtColor, cv2.threshold)

img2gray = cv2.cvtColor(copyIma,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 254, 255, cv2.THRESH_BINARY)

取得上面的漫水填充法結果圖後,我們一樣先轉成灰階,
由於剛剛我們使用 (255, 255, 255) 來填充背景部分,
我們設定閥值(threshold)為 254,濾出背景。

最後我們要取得遮罩,等等要拿來挖空原圖,
遮罩有點類似就是要挖空的形狀,所以我們把挖空的地方填成黑色。

https://ithelp.ithome.com.tw/upload/images/20201004/20120424bcs6sVih0Z.png

將遮罩印在原來的圖片上,有點像挖空的感覺 (cv2.bitwise_and)

rows, cols, channels = img2.shape
x = 450 
y = 170
roi = img1[y:y+rows, x:x+cols]

print("Use mask to crop origin image1:")
img1_bg = cv2.bitwise_and(roi, roi, mask = mask)

我們先透過 roi 設定好我們想p圖的位置,
之後直接把這區域先取出來,然後使用 cv2.bitwise_and 直接進行挖空,

  • 因為mask黑色部分是0,只要and之後都會是黑,
  • 而白色部分是255,只要and之後都會保持原樣。

https://ithelp.ithome.com.tw/upload/images/20201004/20120424gk6KL9sZNC.png

挖空後,反向操作取得原先要P圖的人物 (cv2.bitwise_not, cv2.bitwise_and)

mask_inv = cv2.bitwise_not(mask)
img2_fg = cv2.bitwise_and(img2, img2, mask = mask_inv)

現在換我們來 cv2.bitwise_and 要p的圖片,
我們先將原來的mask運用 cv2.bitwise_not,取得反向的mask,
變成這個mask專門來幫助我們挖掉背景。

  • 因為mask黑色部分(現在是背景)是0,只要and之後都會是黑,
  • 而白色部分是255(現在是人),只要and之後都會保持原樣。

https://ithelp.ithome.com.tw/upload/images/20201004/20120424p6SxXDnTVo.png

https://ithelp.ithome.com.tw/upload/images/20201004/20120424Gcb8p4oh5O.png

合併人物至原來的圖片 (cv2.add)

dst = cv2.add(img1_bg,img2_fg)
img1[y:y+rows, x:x+cols] = dst

剛剛在步驟4,我們已經把原圖要p的地方挖空(=0)
剛剛在步驟5,我們已經把要p的地方取出(有乾淨的值),其他背景(=0)
我們只需要將這兩個單純相加 (=0的地方已經不構成影響),
即可以得到乾淨的合成圖片。

我們使用 cv2.add
最後只要合併結果至原圖,p圖就完成囉!

https://ithelp.ithome.com.tw/upload/images/20201004/20120424YpE8BgoZDY.png


本文同步發佈在: 第 12 屆 iT 邦幫忙鐵人賽
【沒錢ps,我用OpenCV!】Day 22 – 綜合運用1,用 OpenCV 來P圖囉! 來運用各種之前學習的各種東西吧! merge two images


Reference

【沒錢ps,我用OpenCV!】Day 3 – 基本修圖2,OpenCV 圖片的剪裁、旋轉、縮放 (crop, rotate, resize),在 jupyter 中直接找尋圖片的座標

【沒錢ps,我用OpenCV!】Day 15 – 進階修圖2,OpenCV 當然也有像 ps 圖層的功能! 什麼?圖片也能加減法?! Add, Subtract, AddWeighted

【沒錢ps,我用OpenCV!】Day 17 – 進階修圖4,運用 OpenCV 的終極圖層處理大全, 想P圖該怎麼P (bitwise_or, and, xor, not, addWeighted)

【沒錢ps,我用OpenCV!】Day 18 – 進階修圖5,運用 OpenCV 做圖片二值化,產生黑白的圖片吧!cv2.threshold 各種選擇參數大全

【沒錢ps,我用OpenCV!】Day 21 – 花式修圖3,OpenCV 也有 photoshop 的魔術棒工具?! 漫水填充法 cv2.floodFill (Magic Wand Tool)

https://docs.opencv.org/master/d0/d86/tutorial_py_image_arithmetics.html

⭐Python OpenCV 相關文章整理⭐:
⭐基礎知識篇⭐:
1.【OpenCV】1 – 安裝 python OpenCV install 電腦中圖片的基本概念總整理 (附錄:OpenCV 快速測試用程式碼)
2.【OpenCV】2 – OpenCV 圖片的讀取、顯示、存檔 (load, show, save),附贈簡易理解「相對路徑」與「絕對路徑」
3.【OpenCV】OpenCV 利用 python OpenCV 查詢 image 大小, img shape sample code (內附範例程式碼)
⭐基本圖像處理篇⭐:
1.【OpenCV】OpenCV 利用 python OpenCV 縮放圖片 image 大小, cv2 resize (內附程式碼)
2.【OpenCV】3 – python OpenCV 的剪裁、旋轉、縮放 (crop, rotate, resize)
3.【OpenCV】4 – 運用 OpenCV 調整光線 (modify brightness, intensity)
4.【OpenCV】5 – 運用 OpenCV 調整亮度、飽和度(透過轉移至 HLS 顏色空間) modify lightness, saturation
5.【OpenCV】6 – 運用 OpenCV 調整色調(冷色系/暖色系)、色溫(白平衡)modify color temperature, white balance
6.【OpenCV】7 – 運用 OpenCV 為圖片增加一些顆粒感 (增加高斯噪點) add gaussian noise
7.【OpenCV】8 – 運用 OpenCV 改變圖片的對比度 modify contrast (內含:網路上常見錯誤調整對比度方式的分析)
8.【OpenCV】9 – 運用 OpenCV 降低圖片的高光 reduce highlights
9.【OpenCV】11 – OpenCV 建立新空白圖、畫點、畫圓 create new pictures, draw points and draw circle
10.【OpenCV】12 – 運用 OpenCV 畫線、畫矩形、畫橢圓 draw lines, draw rectangle, draw ellipse
11.【OpenCV】13 – 運用 OpenCV 在圖片上寫文字、查色碼、顯示色碼顏色 write text, get and show RGB Color Code
⭐進階圖像處理篇⭐:
1.【OpenCV】14 – 運用 OpenCV 顯示圖片直方圖、分離與合併RGB通道 show histogram, split, merge RGB channel
2.【OpenCV】15 – OpenCV 當然也有像 ps 圖層的功能! 什麼?圖片也能加減法?! Add, Subtract, AddWeighted
3.【OpenCV】16 – 運用 OpenCV 幫助我們找圖片的輪廓(高斯模糊、Canny) cv2.GaussianBlur, cv2.Canny
4.【OpenCV】17 – 運用 OpenCV 的終極圖層處理大全, 想P圖該怎麼P (bitwise_or, and, xor, not, addWeighted)
5.【OpenCV】18 – 運用 OpenCV 做圖片二值化,產生黑白的圖片吧!cv2.threshold 各種選擇參數大全
6.【OpenCV】19 – OpenCV 的圖片自適應二值化,產生更好效果的黑白圖片!cv2.adaptiveThreshold
7.【OpenCV】20 – OpenCV 的各種 Threshold 方法整理,Otsu’s Threshold 大津二值化,自動計算最佳閥值,做出最好的黑白效果圖!
8.【OpenCV】26 – 銳化圖片,將模糊的圖片變得更清晰吧! sharpen images
⭐冷門應用篇⭐:
1.【OpenCV】python OpenCV 分析影像模糊程度 檢測圖片模糊 blur sample code (內含範例程式碼)
2.【OpenCV】21 – OpenCV 也有 photoshop 的魔術棒工具?! 漫水填充法 cv2.floodFill (Magic Wand Tool)
3.【OpenCV】27 – 顏色映射 – OpenCV 內建的自動配色?! auto recolor images, cv2.applyColorMap
⭐影片處理篇⭐:
1.【OpenCV】OpenCV 利用 python OpenCV 將圖片製作成一部影片 (內附程式碼) make video from images
2.【OpenCV】OpenCV 利用 python OpenCV 將一部影片拆成一張張圖片 sample code (內附程式碼) get images from video
3.【OpenCV】用 OpenCV 開啟 rtsp 即時影像串流 sample code (內含範例程式碼) – python OpenCV rtsp
4.【OpenCV】python pyinotify video player 利用 OpenCV + inotify 製作即時影片播放器 sample code (內含範例程式碼)
⭐綜合應用篇⭐:
1.【OpenCV】10 – 日系濾鏡總集篇,運用 OpenCV 製作屬於自己的濾鏡吧 (內含可於網頁上直接完成濾鏡的 colab )
2.【OpenCV】22 – 綜合運用1,用 OpenCV 來P圖囉! 來運用各種之前學習的各種東西吧! merge two images
3.【OpenCV】23 – 綜合運用2,(資料標註) 用 OpenCV 來製作一個標記點小工具吧! 滑鼠與視窗控制 label points
4.【OpenCV】24 – 綜合運用3,(應用app) 用 OpenCV 來製作一個照片文件掃描機吧! photo scanner 透視投影
5.【OpenCV】25 – 綜合運用4,用 OpenCV 來把圖片p到各種奇怪的地方吧! 透視投影 cv2.warpPerspective, merge two images
6.【OpenCV】28 – Final Project v1,於是沒錢買ps的我,開發了自己的photoshop,我的天啊 My photoshop made by OpenCV
7.【OpenCV】29 – Final Project v2,於是沒錢買ps的我,開發了自己的photoshop,我的天啊 My photoshop made by OpenCV
8.【OpenCV】30 – Final Project v3,於是沒錢買ps的我,開發了自己的photoshop,我的天啊 My photoshop made by OpenCV
9.【OpenCV】用 python OpenCV 計算 iou 的方法 (內附範例程式碼) sample code
⭐【喜歡我的文章嗎? 歡迎幫我按讚~ 讓基金會請創作者喝一杯咖啡!
如果喜歡我的文章,請幫我在下方【按五下Like】 (Google, Facebook 免註冊),會由 「LikeCoin」 贊助作者鼓勵繼續創作,讀者們「只需幫忙按讚,完全不用出錢」哦!

likecoin-steps