通過(guò)Python代碼實(shí)現(xiàn)照片秒變藝術(shù)素描畫效果
準(zhǔn)備工作
安裝必要的第三方庫(kù)
pip install opencv-python pip install numpy pip install matplotlib # 用于在Jupyter Notebook或腳本中方便地顯示圖像
素描效果的“三步走”戰(zhàn)略
- 灰度化:素描是黑白的,所以第一步是去除色彩信息。
- 反轉(zhuǎn)與模糊:這是最關(guān)鍵的一步,我們通過(guò)反轉(zhuǎn)灰度圖并進(jìn)行高斯模糊,來(lái)創(chuàng)建出圖像的“底片”,這為后面生成線條打下基礎(chǔ)。
- 混合:將原始的灰度圖與模糊后的“底片”進(jìn)行混合,創(chuàng)造出類似鉛筆筆觸的明暗對(duì)比效果。
示例代碼
我們把上述步驟翻譯成 Python 和 OpenCV 代碼。
import cv2
import matplotlib.pyplot as plt
def image_to_sketch(image_path):
"""
將指定路徑的圖像轉(zhuǎn)換為素描風(fēng)格。
"""
# 步驟 1: 讀取圖像并轉(zhuǎn)換為灰度圖
# cv2.imread() 用于讀取圖片
# cv2.cvtColor() 用于轉(zhuǎn)換顏色空間,cv2.COLOR_BGR2GRAY 表示從BGR(OpenCV默認(rèn))轉(zhuǎn)為灰度
img_bgr = cv2.imread(image_path)
if img_bgr is None:
print(f"錯(cuò)誤: 無(wú)法讀取圖片,請(qǐng)檢查路徑 '{image_path}' 是否正確。")
return
img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
# 步驟 2: 反轉(zhuǎn)灰度圖 (形成“底片”)
# cv2.bitwise_not() 用于按位取反,白色變黑色,黑色變白色
img_gray_inverted = cv2.bitwise_not(img_gray)
# 步驟 3:對(duì)反轉(zhuǎn)后的圖像進(jìn)行高斯模糊
# cv2.GaussianBlur() 用于模糊圖像,以平滑細(xì)節(jié)
# (21, 21) 是高斯核的大小,必須是奇數(shù),值越大,模糊程度越高
img_blur = cv2.GaussianBlur(img_gray_inverted, (21, 21), 0)
# 步驟 4: 再次反轉(zhuǎn)模糊后的圖像
img_blur_inverted = cv2.bitwise_not(img_blur)
# 步驟 5: 關(guān)鍵一步!用顏色減淡(Color Dodge)方法混合灰度圖和模糊反轉(zhuǎn)圖
# cv2.divide() 將兩個(gè)圖像相除,可以模擬出顏色減淡的效果
# 256.0 是為了防止除以0的錯(cuò)誤,并確保結(jié)果是浮點(diǎn)數(shù)以便精確計(jì)算
img_sketch = cv2.divide(img_gray, img_blur_inverted, scale=256.0)
return img_bgr, img_sketch
# --- 主程序 ---
if __name__ == "__main__":
# 替換成你自己的圖片路徑
input_image_path = 'my_photo.jpg'
original_image, sketch_image = image_to_sketch(input_image_path)
if original_image is not None and sketch_image is not None:
# 使用 Matplotlib 顯示原始圖像和素描圖像
plt.figure(figsize=(10, 5))
# 顯示原始圖像 (注意OpenCV的BGR要轉(zhuǎn)為RGB)
plt.subplot(1, 2, 1)
plt.imshow(cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB))
plt.title('Original Image')
plt.axis('off')
# 顯示素描圖像
plt.subplot(1, 2, 2)
plt.imshow(sketch_image, cmap='gray')
plt.title('Sketch')
plt.axis('off')
plt.show()
# 如果想保存結(jié)果
output_image_path = 'my_photo_sketch.jpg'
cv2.imwrite(output_image_path, sketch_image)
print(f"素描圖像已保存至: {output_image_path}")
效果

結(jié)語(yǔ)
到此這篇關(guān)于通過(guò)Python代碼實(shí)現(xiàn)照片秒變藝術(shù)素描畫效果的文章就介紹到這了,更多相關(guān)Python照片素描畫效果內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python自動(dòng)計(jì)算圖像數(shù)據(jù)集的RGB均值
這篇文章主要為大家詳細(xì)介紹了python自動(dòng)計(jì)算圖像數(shù)據(jù)集的RGB均值,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
Python3中對(duì)json格式數(shù)據(jù)的分析處理
這篇文章主要介紹了Python3中對(duì)json格式數(shù)據(jù)的分析處理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Python基于smtplib協(xié)議實(shí)現(xiàn)發(fā)送郵件
這篇文章主要介紹了Python基于smtplib協(xié)議實(shí)現(xiàn)發(fā)送郵件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
python matplotlib繪圖,修改坐標(biāo)軸刻度為文字的實(shí)例
今天小編就為大家分享一篇python matplotlib繪圖,修改坐標(biāo)軸刻度為文字的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Django接收post前端返回的json格式數(shù)據(jù)代碼實(shí)現(xiàn)
這篇文章主要介紹了Django接收post前端返回的json格式數(shù)據(jù)代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
TensorFlow卷積神經(jīng)網(wǎng)絡(luò)MNIST數(shù)據(jù)集實(shí)現(xiàn)示例
這篇文章主要介紹了TensorFlow卷積神經(jīng)網(wǎng)絡(luò)MNIST數(shù)據(jù)集的實(shí)現(xiàn)示例的過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11
Python編程中Python與GIL互斥鎖關(guān)系作用分析
GIL互斥鎖用來(lái)保護(hù)Python世界里的對(duì)象,防止同一時(shí)刻多個(gè)線程執(zhí)行Python字節(jié)碼,確保線程安全,但也導(dǎo)致Python線程無(wú)法利用多核CPU優(yōu)勢(shì),本文來(lái)探討Python將來(lái)是否有可能去除GIL2021-09-09

