使用 Python 將任何圖像轉換為草圖

使用 Python 將任何圖像轉換為草圖

製作精美的草圖需要花費大量的時間和精力。幸運的是,編程已經發展,因此您現在可以輕鬆地轉換圖像並創建漂亮的設計。您可以執行的一項令人印象深刻的技術是將圖像轉換為數字草圖。

雖然機械草圖看起來不像您自己的鉛筆劃,但輸出仍然值得嘗試。了解如何使用超級友好的 Python 語言中的 OpenCV 模塊編寫此類應用程序。

OpenCV 模塊

OpenCV 是英特爾開發和維護的開源計算機視覺方法庫,用於圖像處理和計算機視覺。它使用戶可以輕鬆創建優化的應用程序,實時與圖像和視頻交互,並根據需要選擇理想的算法。

OpenCV 的一些流行應用包括人臉檢測、電影攝影中的自動人臉跟踪、社交媒體過濾器、汽車牌照識別和閉路電視監控。要在 Python 中使用 OpenCV 模塊,請打開終端並鍵入以下命令:

pip install opencv-python

如何使用 Python 將任何圖像轉換為草圖

要將您喜歡的圖像轉換為數字草圖,請先將其放在與新 Python 程序相同的文件夾中,以便於引用。然後使用以下步驟開始構建您的程序。

第一步是將 OpenCV 模塊導入您的環境。一旦 OpenCV 可用,您就可以使用它的功能來執行各種任務。將圖像文件的路徑傳遞給imread()函數以加載它。將圖像存儲在變量中(此處稱為image1)以供將來參考。

將窗口的標題存儲在名為window_name的變量中。當您選擇使用imshow()函數顯示圖像時,這將很有用。該函數需要兩個參數:標題和要顯示的圖像。

import cv2

image1 = cv2.imread('image.jpg')
window_name = 'Actual image'
cv2.imshow(window_name, image1)

獲得所需的圖像後,需要執行五個操作才能將其轉換為草圖。首先,將彩色圖像轉換為灰度圖像。您可以使用cvtColor()函數來執行此操作。此函數接收要更改其顏色的圖像和轉換代碼,例如COLOR_BGR2GRAY

grey_img = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)

獲得灰度圖像後,反轉其顏色。此時,您需要了解計算機如何形成圖像。圖像由許多具有不同強度的微小像素組成。在彩色圖像中,每個像素都包含紅色、綠色和藍色分量,每個分量的強度都在 0 到 255 之間變化。

在灰度圖像中,只有灰色陰影,因此像素的強度在 0 和 1 之間變化。要反轉此圖像的像素強度,請將灰度圖像傳遞給bitwise_not()函數。

顧名思義,此函數將每個像素的值反轉為其互補等效值。所有大於 0 的像素都設置為 0,所有等於 0 的像素都設置為 255。

invert = cv2.bitwise_not(grey_img)

反轉像素強度後,您可以藉助高斯模糊對圖像進行平滑處理。高斯模糊過程使用高斯濾波器。高斯濾波器是一種低通濾波器,只允許低頻通過,去除信號或圖像的高頻分量。

OpenCV 的GaussianBlur()函數接受四個參數。這些是充當源圖像的矩陣對象、ksize(核的大小)和 sigmaX(高斯核標準差)。

假設你手裡拿著一張實物照片。如果你想模糊它,你可以在上面塗上幾塊蠟或羊皮紙。您可以將內核想像成這張透明的紙片。在數字方面,這種情況有點不同。要對數字圖像進行模糊、銳化和應用其他效果,您可以將矩陣與圖像像素的強度相乘。

ksize 總是一個正奇數。隨著內核大小的增加,模糊度也會增加。要了解 sigmaX,請假設您正在紙上塗蠟。當你塗上蠟時,紙張會變得均勻透明。同樣,您必須使內核的值接近特定點(平均值)。sigmaX 值定義圖像中像素的平均值與其他值之間的差異。

將反轉圖像,內核大小為 (21, 21) 和 0 標準差傳遞給高斯模糊函數:

blur = cv2.GaussianBlur(invert, (21, 21), 0)

再次將模糊圖像傳遞給 bitwise_not() 函數以反轉它:

invertedblur = cv2.bitwise_not(blur)

最後,使用divide()函數對灰度圖像數組和倒置模糊圖像數組進行逐元素除法,尺度為256。

sketch = cv2.divide(grey_img, invertedblur, scale=256.0)

本質上,該函數執行以下操作:

def divide(grey_img, b, invertedblur=256.0):
    return (grey_img * scale) / invertedblur

將結果存儲在名為 sketch 的變量中。要保存最終圖像,請將輸出文件的名稱和草圖圖像傳遞給imwrite()函數。要驗證它,您可以使用 imread() 函數加載保存的草圖圖像,提供窗口標題並使用 imshow() 函數顯示它。

通過傳遞 0使用waitkey()函數顯示原始圖像窗口和生成的草圖窗口,直到您按下任意鍵。

cv2.imwrite("sketch.jpeg", sketch)
image = cv2.imread("sketch.jpeg")
window_name ='Sketch image'
cv2.imshow(window_name, image)
cv2.waitKey(0)

把所有的代碼放在一起,你的程序就準備好了。

使用此 Python 程序將圖像轉換為草圖的示例輸出

您可以選擇一個美麗的風景圖像並通過程序運行它來生成這個令人驚嘆的數字草圖。

圖像到素描房子與湖

在肖像圖像上,程序會生成以下數字草圖。

圖像到素描人

您可以根據自己的喜好試驗函數的參數,以生成您想要的數字草圖。

圖像處理和計算機視覺

圖像處理和計算機視覺是兩個密切相關的技術領域。它們都涉及改變數字圖像以獲得預期的結果。圖像處理側重於改進圖片,而計算機視覺則著眼於在圖像中找到模式和對像以理解它。

Scikit-image 是另一個提供各種圖像處理功能的 Python 庫。它有幾個預編譯模塊、過濾器、層、轉換等。如果您正在尋找用於深度學習模型(例如 CNN 和 RNN)的模塊,您可能想要探索 Torchvision。

發佈留言

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