昨天我們利用 stable-diffusion-webui-depthmap-script 套件取得了場景照的深度圖,但距離分離前後景還差得遠,所以今天我們進一步來用二值化的技術試著把前後景分離看看吧!
二值化是一種影像處理技術,用來將灰階圖像轉換為只有兩個值的圖像,通常是黑色(0)和白色(255)。這種轉換通過應用一個閾值(threshold)來完成:大於或等於閾值的像素被設為白色,小於閾值的像素被設為黑色。二值化在模式識別、物件偵測以及文件處理(如文字辨識)等領域中非常常見,因為它可以簡化圖像數據並強調主要結構。
記得先 import 昨天那篇文所 import 的套件~
def binarized(image: Image, threshold=38) -> Image:
if not image.mode.startswith('I'):
raise Exception(f"{image.mode = }, but it must be 'I'!")
image_array = np.array(image) // 256
image_array = image_array.astype(np.uint8)
_, bin_image = cv2.threshold(image_array, int(threshold*2.55), 255, cv2.THRESH_BINARY)
return (binarized_image := Image.fromarray(bin_image))
上述函式是圖像二值化的 Python 實作程式碼,步驟說明如下:
至於那個閾值要設多少嘛 —— 筆者建議可用迴圈把多個閾值遍歷一次並根據依使用情境建立的判斷標準 (e.g. 黑色像素占比) break 出來。
輸出結果如下:
其實這樣並沒有完全取得背景的範圍,但已經比單純的深度圖明確地分離許多了,明天我們再用另一個工具將背景完全框出來!