iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 16
0
Software Development

【錢不夠買ps的我,只好用OpenCV來修圖了!】系列 第 16

【沒錢ps,我用OpenCV!】Day 16 - 進階修圖3,運用 OpenCV 幫助我們找圖片的輪廓(高斯模糊、Canny) cv2.GaussianBlur, cv2.Canny

先來看看今天的結果圖

https://ithelp.ithome.com.tw/upload/images/20200928/20120424KzJbqNKdH1.png

還是請我們的貓貓助教來幫忙XDDDD

-> 此篇文章的程式碼 github

Day16_高斯模糊找輪廓_GaussianBlur_Canny.ipynb

前言

基本修圖技能學習完之後,
再來我們要來學一些比較進階會使用的修圖技巧囉!

運用 OpenCV 幫助我們找圖片的輪廓(高斯模糊、Canny)

今天我們會來測試兩張圖片!
首先我們先建立比較好理解的較簡單圖片。

shape = (200, 200, 3)
origin_img = np.zeros(shape, np.uint8)
origin_img = draw_cirlces(origin_img, circle_mid=(50,50), color=(0,255,0) ,radius=30)
origin_img = draw_cirlces(origin_img, circle_mid=(50,150), color=(255,255,0) ,radius=27)
origin_img = draw_cirlces(origin_img, circle_mid=(100,100), color=(255,0,255) ,radius=23)
origin_img = draw_cirlces(origin_img, circle_mid=(150,60), color=(255,0,0) ,radius=25)
origin_img = draw_cirlces(origin_img, circle_mid=(150,150), color=(0,0,255) ,radius=21)
origin_img = draw_cirlces(origin_img, circle_mid=(120,35), color=(0,255,255) ,radius=18)
origin_img = draw_cirlces(origin_img, circle_mid=(110,150), color=(255,255,255) ,radius=40)

print("origin picture:")
show_img(origin_img)

其實上面的程式幾乎都只是在為這張範例圖片畫圓而已...
不用想得太複雜哈哈哈哈

https://ithelp.ithome.com.tw/upload/images/20200928/20120424UtvabrTXC7.png

第一步 - 轉成灰階

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # start from BGR -> gray

因為彩色的圖片有三個顏色通道需要處理,
但我們今天只需要找到輪廓,用一個通道即可,
這樣能使得我們在運算上不會到太複雜,
因此我們會先將圖片轉成灰階。

https://ithelp.ithome.com.tw/upload/images/20200928/20120424a0UA8FTSRk.png

第二步 - OpenCV 的高斯模糊

# 高斯模糊(高斯平滑),與計算核心大小
def do_GaussianBlur(gray):
    kernel_size = 5
    blur_gray = cv2.GaussianBlur(gray,(kernel_size, kernel_size), 0)
    return blur_gray

高斯模糊(又稱高斯平滑),正如他的名字,就是我們將圖片模糊化,
kernel_size 是我們進行運算時,對於多大範圍的圖片進行運算。

簡單可以理解為:我們如果對 5x5 的 kernel_size 運算,
那圖片每一個 5x5 的中心受到高斯模糊的影響會最大

算出來就會是一張比較模糊的圖片。

https://ithelp.ithome.com.tw/upload/images/20200928/20120424kxyGXTYWeG.png

(看得出來有比較模糊吧哈哈哈哈哈)

Q: 為什麼要模糊?

A: 因為先做高斯模糊(或說經過高斯平滑)的圖片能夠去除很多圖片的噪聲(雜訊),
更容易讓我們找到更精準的輪廓。

第三步 - OpenCV 的 Canny 邊緣檢測

# Canny邊緣運算
def do_Canny(blur_gray):
    low_threshold = 1
    high_threshold = 90
    edges = cv2.Canny(blur_gray, low_threshold, high_threshold)
    return edges

其中有兩個參數需要自己依情況調整,
我們知道灰階圖片的值介於 0~255 之間,
情況有三種:

  • 高於 high_threshold: 為 strong edge ,我們直接保留
  • 介於 low_thresholdhigh_threshold: 為 weak edge
    Canny會檢測 weak edge 是否能與 strong edge 相連,
    如果會相連的才會被保留。
  • 低於 low_threshold: 我們都不當作 edge

https://ithelp.ithome.com.tw/upload/images/20200928/201204241dEVjzRvPf.png

真實場景運用

我們來看看貓貓的圖跑上面的流程會發生什麼事情~
我們設定 low_threshold = 10、high_threshold = 90 的時候

https://ithelp.ithome.com.tw/upload/images/20200928/20120424bIPggSkngo.png

我們設定 low_threshold = 1、high_threshold = 10 的時候

https://ithelp.ithome.com.tw/upload/images/20200928/20120424LRj9POfSyG.png

(有一種素描畫的感覺?)

low_threshold, high_threshold,我們會依據使用情境不同調整參數,
達到自己需要的效果。

Reference

https://ask.csdn.net/questions/706468

https://www.kancloud.cn/aollo/aolloopencv/269599

https://chtseng.wordpress.com/2016/12/05/opencv-edge-detection%E9%82%8A%E7%B7%A3%E5%81%B5%E6%B8%AC/

https://medium.com/@pomelyu5199/canny-edge-detector-%E5%AF%A6%E4%BD%9C-opencv-f7d1a0a57d19


上一篇
【沒錢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來修圖了!】30

尚未有邦友留言

立即登入留言