OpenCV-凸透鏡效果

透過凸透鏡將光線以不同角度偏折,將立體空間壓縮至平面,最大化地囊括場景內容。這種獨特的視角變換,正是凸透鏡效果的精髓。除了在運動攝影中聚焦動態,或在搞笑影片中創造誇張趣味,我們又如何透過影像處理重現這種視覺效果?

素材取用

圖片:<雲端下載> | 清明 by DaylightAllure

概念釐清

凸透鏡效果,或者我們更常說的魚眼效果,其原理是模擬通過凸透鏡時所產生的視覺效果。當我們透過凸透鏡觀察時,會發現靠近圓心的部分會產生明顯的放大現象,而隨著距離圓心越遠的地方,影像就會出現不同程度的形體扭曲。那這種奇葩的視覺效果究竟有什麼用途呢?

最初始的概念是為了頭頂無邊無盡的穹頂,透過這種讓光變形散射的方式取得最大的角度,比起超廣角鏡頭能含括更多的資訊,並透過形變呈現出空間關係。

其最常被用來營造誇張搞笑的氛圍,製造有趣的視覺效果。另外在拍攝動態運動場景時,魚眼效果更能在保持對主要人物或物體清晰聚焦的同時,捕捉到更寬闊的環境畫面,為觀眾帶來更加豐富的視覺體驗與動態模糊。

投影方式

但魚眼鏡頭可以有不同的角度,疊加之後又有不同的效果,廣泛在攝影領域中擁有四種投影方式。當然針對運算模式的不同,則帶來不同程度的變形方式與用途。

實作過程

那關於魚眼這個名詞,我們可以想像是一個球體的狀態,那我們該如何去計算變動區域?就需要先製作一個遮罩,接著塞出哪些像素要被納入其中。而這邊採用普及的 等距投影 換算回距離的期間,則會因為數值平方而產生傾斜,距離越遠偏差就越大。最終只要對照原始的圖片來映射內容,便完成最基礎常見的魚眼效果。

圖片測試

def convex(img, center, radius):
    """
    凸透鏡效果。

    Args:
        img (numpy.ndarray): 輸入圖片。
        center (tuple): 凸透鏡中心點 (cx, cy)。
        radius (int): 凸透鏡半徑。

    Returns:
        output (numpy.ndarray): 處理後的圖片。
    """
    # 紀錄寬高數值
    width, height, _ = img.shape
    # 解包圓心座標
    cx, cy = center

    output = img.copy()

    # 建立一個座標網格
    y, x = np.indices((width, height))
    # 計算像素與圓心的距離
    d = np.sqrt((x - cx)**2 + (y - cy)**2)
    # 建立遮罩
    mask = (d <= radius)

    # 把距離換算回座標
    nx = np.int32((x[mask] - cx) * d[mask] / radius + cx)
    ny = np.int32((y[mask] - cy) * d[mask] / radius + cy)

    # 對應舊的座標內容
    output[mask] = img[ny, nx]

    return output

那經過我們前述的處理之後,就能來看看實際的成效如何。但此時最重要的事情則是,需要各位尋找各自喜歡的圓心座標點來做處理,在評估時是比較麻煩且需要測試的。在範例中我們點在鼻頭對臉做局部處理,那當然也可以整張圖做處理,算下中心點與邊角距離即可。

center = (820, 1300)
radius = 640

img_convex = convex(img, center, radius)
opencv-凸透鏡效果-showcase-0

拼貼後製

不過單純的讓影像在特定位置扭曲,這樣的喜感幾次之後就會開始覺得疲乏。各位可能還是難以想像用途,於是乎這邊我們稍微在黑底挖個孔,將臉聚焦前方觀察一下,透過科技化的處理順便理解構圖方式。

如果此時我們稍微改一下周遭的環境,比如說模糊化就可能類似於偷窺,把黑底換成門板可以充當貓眼。魚眼效果在生活中確實頻繁應用於小設備,卻必須能看到更多東西的時候。對於手繪黨來說肯定是天大的好消息,因為這種超乎常理的畫風較少存在我們的腦袋內,而且這種方式就不用再額外設計一次角色。

opencv-凸透鏡效果-showcase-1

喔或者說,這種方式其實也很適合製作球體,把國旗變形一下就可以做成波蘭球囉!

後話

除了單純的影像扭曲,我們更進一步探索了魚眼效果的創意應用,例如透過挖孔、模糊化等後製手法,創造出不同的獨特效果。這些應用不僅展示了魚眼效果的靈活性,也啟發我們在影像處理上的無限可能,偶爾也對應在繪圖時的空間處理。

參考

[1] 凸透鏡效果 — STEAM 教育學習網
https://steam.oxxostudio.tw/category/python/ai/opencv-convex-lens.html

額外讀物

[1] 鱼眼镜头的四种投影模型 — CSDN 博客 by Hali_Botebie
https://blog.csdn.net/djfjkj52/article/details/122238513

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料