Seam Carving 圖像演算法,改變圖片長寬比例後卻不違和
如果我們要修改圖片的長寬比例,比方說把4:3的圖片拉寬成16:9的話,最常遇到的問題就是會因為比例失真而讓圖片看了不太舒服(人物會變得矮胖),然而Seam Carving圖像演算法則可以透過分析,剔除圖像中不重要的部分,讓畫面中的主要人物或物品比例不受影響。<h2>變形或裁切的兩難</h2> <p>筆者直接以下列的範例圖片,來說明改變圖片長寬比例會造成的問題。假設我們將原始比例為4:3的圖片,直接放到16:9的螢幕上顯示的話,就會發現左右兩側的空間沒有內容。</p> <p>如果直接將畫面拉伸至滿版的話,就會產生圖片中的建築物比例失真,然而如果照比例放大的話,則會遇到建築物被裁切、無法顯示完整圖片的問題。</p> <p>然而由三菱電子研究實驗室(Mitsubishi Electric Research Labs)的Shai Avidan,以色列Interdisciplinary Center學院的Ariel Shamir所研發的Seam Carving圖像演算法,就能解決這個兩難問題。</p> <p style="text-align: center;"><img style="display: inline-block;" src="https://cdn1-techbang.pixfs.net/system/images/429988/original/2f9fc5329169d9eff0babf514294eef5.jpg?1517901505" alt="" width="720" height="405" /><label class="figuresaid" style="width: 720px; display: block; text-align: left; color: #555; line-height: 22px; padding: 0 3px 22px 3px; border-bottom: 2px solid #f0f0f0; margin: -5px auto 1rem auto;"><span style="color: #2382c5; padding-right: 5px;"> ▲ </span>將4:3的圖片放在16:9的螢幕,會讓左右兩側沒有內容。(圖片來源:<a href="https://github.com/esimov/caire">Caire GitHub</a>,標題圖與下同)</label></p> <p style="text-align: center;"><img style="display: inline-block;" src="https://cdn1-techbang.pixfs.net/system/images/429989/original/b494798cf444cbb33885983c91d27b1d.jpg?1517901505" alt="" width="720" height="405" /><label class="figuresaid" style="width: 720px; display: block; text-align: left; color: #555; line-height: 22px; padding: 0 3px 22px 3px; border-bottom: 2px solid #f0f0f0; margin: -5px auto 1rem auto;"><span style="color: #2382c5; padding-right: 5px;"> ▲ </span>直接拉伸至滿版會讓比例錯誤。</label></p> <p style="text-align: center;"><img style="display: inline-block;" src="https://cdn1-techbang.pixfs.net/system/images/429990/original/1592cfd1ad1d6fa7f33a3c41144c324e.jpg?1517901506" alt="" width="720" height="405" /><label class="figuresaid" style="width: 720px; display: block; text-align: left; color: #555; line-height: 22px; padding: 0 3px 22px 3px; border-bottom: 2px solid #f0f0f0; margin: -5px auto 1rem auto;"><span style="color: #2382c5; padding-right: 5px;"> ▲ </span>如果強制放大,則會讓圖片中的物件被剪裁。</label></p> <p style="text-align: center;"><img style="display: inline-block;" src="https://cdn0-techbang.pixfs.net/system/images/429991/original/3cebd677f6486f6d6ea305735a420ea6.jpg?1517901507" alt="" width="720" height="432" /><label class="figuresaid" style="width: 720px; display: block; text-align: left; color: #555; line-height: 22px; padding: 0 3px 22px 3px; border-bottom: 2px solid #f0f0f0; margin: -5px auto 1rem auto;"><span style="color: #2382c5; padding-right: 5px;"> ▲ </span>Seam Carving則是可以在改變圖片比例的過程中,避免影響圖中物件的比例。</label></p> <h2>調整不明顯的區域來改變比例</h2> <p>Seam Carving圖像演算法的概念,就是會辨識圖片中哪些區域是重要的物件,而哪些區域則是改變比例後造成的失真較輕微,程式就會透過拉伸或壓縮不明顯的區域,來達到改變比例的效果。</p> <p>在實際應用時,程式會先透過邊緣偵測的方式,產生圖片的能量分佈圖(Energy Map),並分析這些數據,找出代表不重要的能量最低區域。接下來程式會根據改變比例為垂直或水平方向,由上到下或由左至右,透過演算法計算出每條「縫合線」的權值,當權值越高則代表該縫合線上的像素越重要。</p> <p>有了這些數據後,程式會估算各種連接各縫合線的可能方式,找出累積最少能量的連接方式,並反覆迭代計算,來找出改變比例後,影響視覺感受最少的區域,最後就能透過「犧牲」這些區域的方式,來改變圖片的比例。</p> <p>Seam Carving除了能夠用於調整比例外,還能應用於其他圖像處理的領域,舉例來說,要移除圖片中的物件,也能透過Seam Carving來維持結果圖片在視覺上的一致性。</p> <p style="text-align: center;"><img style="display: inline-block;" src="https://cdn1-techbang.pixfs.net/system/images/429994/original/850dfa32367b3abbec4fb82400324d9a.jpg?1517901824" alt="" width="720" height="357" /><label class="figuresaid" style="width: 720px; display: block; text-align: left; color: #555; line-height: 22px; padding: 0 3px 22px 3px; border-bottom: 2px solid #f0f0f0; margin: -5px auto 1rem auto;"><span style="color: #2382c5; padding-right: 5px;"> ▲ </span>左方為待處理的原始圖片,右方3格則是演算法計算的能量分佈。(圖片來源:<a href="https://inst.eecs.berkeley.edu/%7Ecs194-26/fa16/hw/proj4-seamcarving/imret.pdf">Seam Carving for Content-Aware Image Resizing</a>,下同)</label></p> <p style="text-align: center;"><img style="display: inline-block;" src="https://cdn2-techbang.pixfs.net/system/images/429992/original/0664c9d9fc61868722e81e28b9a7cd6e.jpg?1517901508" alt="" width="720" height="388" /><label class="figuresaid" style="width: 720px; display: block; text-align: left; color: #555; line-height: 22px; padding: 0 3px 22px 3px; border-bottom: 2px solid #f0f0f0; margin: -5px auto 1rem auto;"><span style="color: #2382c5; padding-right: 5px;"> ▲ </span>上方為利用Seam Carving處理的圖片,與下方使用一般方式處理的圖片相比,能夠降低許多因改變比例而造成的違和感。</label></p> <p style="text-align: center;"><img style="display: inline-block;" src="https://cdn1-techbang.pixfs.net/system/images/429995/original/1b68d3c015e5cd35faf701f16f4baca3.jpg?1517901839" alt="" width="720" height="893" /><label class="figuresaid" style="width: 720px; display: block; text-align: left; color: #555; line-height: 22px; padding: 0 3px 22px 3px; border-bottom: 2px solid #f0f0f0; margin: -5px auto 1rem auto;"><span style="color: #2382c5; padding-right: 5px;"> ▲ </span>開發團隊也利用Seam Carving來拉伸浮世繪作為成果展示。</label></p> <p style="text-align: center;"><img style="display: inline-block;" src="https://cdn1-techbang.pixfs.net/system/images/429993/original/ab71f154a52ed578ae9b6d22d907b802.jpg?1517901510" alt="" width="720" height="548" /><label class="figuresaid" style="width: 720px; display: block; text-align: left; color: #555; line-height: 22px; padding: 0 3px 22px 3px; border-bottom: 2px solid #f0f0f0; margin: -5px auto 1rem auto;"><span style="color: #2382c5; padding-right: 5px;"> ▲ </span>Seam Carving也能用於移除物件,左圖為原始圖,小圖的紅色區為欲移除物件,綠色區則為不希望改變比例的物件。處理後圖中已看不到女子,而男子還維持原樣。</label></p> <p>如果讀者想要更深入瞭解Seam Carving的話,可以詳細閱讀開發團隊釋出的<a href="https://inst.eecs.berkeley.edu/%7Ecs194-26/fa16/hw/proj4-seamcarving/imret.pdf">白皮書</a>,而想要動手玩玩看的話,也可以嘗試由Endre Simo所開發的<a href="https://github.com/esimov/caire">Caire</a>,看看這個演算法的效果如何。</p><a href="http://www.facebook.com/TKbang">加入T客邦Facebook粉絲團</a><img src="http://feeds.feedburner.com/~r/techbang/~4/h_NnOOaTVbY" height="1" width="1" alt=""/>