准备工作
安装必要的第三方库
bash
pip install opencv-python
pip install numpy
pip install matplotlib # 用于在Jupyter Notebook或脚本中方便地显示图像
素描效果的"三步走"战略
- 灰度化:素描是黑白的,所以第一步是去除色彩信息。
- 反转与模糊:这是最关键的一步,我们通过反转灰度图并进行高斯模糊,来创建出图像的"底片",这为后面生成线条打下基础。
- 混合:将原始的灰度图与模糊后的"底片"进行混合,创造出类似铅笔笔触的明暗对比效果。
示例代码
我们把上述步骤翻译成 Python 和 OpenCV 代码。
python
import cv2
import matplotlib.pyplot as plt
def image_to_sketch(image_path):
"""
将指定路径的图像转换为素描风格。
"""
# 步骤 1: 读取图像并转换为灰度图
# cv2.imread() 用于读取图片
# cv2.cvtColor() 用于转换颜色空间,cv2.COLOR_BGR2GRAY 表示从BGR(OpenCV默认)转为灰度
img_bgr = cv2.imread(image_path)
if img_bgr is None:
print(f"错误: 无法读取图片,请检查路径 '{image_path}' 是否正确。")
return
img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
# 步骤 2: 反转灰度图 (形成"底片")
# cv2.bitwise_not() 用于按位取反,白色变黑色,黑色变白色
img_gray_inverted = cv2.bitwise_not(img_gray)
# 步骤 3:对反转后的图像进行高斯模糊
# cv2.GaussianBlur() 用于模糊图像,以平滑细节
# (21, 21) 是高斯核的大小,必须是奇数,值越大,模糊程度越高
img_blur = cv2.GaussianBlur(img_gray_inverted, (21, 21), 0)
# 步骤 4: 再次反转模糊后的图像
img_blur_inverted = cv2.bitwise_not(img_blur)
# 步骤 5: 关键一步!用颜色减淡(Color Dodge)方法混合灰度图和模糊反转图
# cv2.divide() 将两个图像相除,可以模拟出颜色减淡的效果
# 256.0 是为了防止除以0的错误,并确保结果是浮点数以便精确计算
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要转为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()
# 如果想保存结果
output_image_path = 'my_photo_sketch.jpg'
cv2.imwrite(output_image_path, sketch_image)
print(f"素描图像已保存至: {output_image_path}")
效果

结语
点个赞,关注我获取更多实用 Python 技术干货!如果觉得有用,记得收藏本文!