【CV】使用 OpenCV 将照片变成卡通

 🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

​​

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

文章目录

导入必要的库:

代码说明:

在 Python 中使用 OpenCV 显示输入图像:

代码说明:

使用 K-Means 聚类的颜色量化:

功能说明:

创建边缘遮罩:

功能说明:

从图像生成铅笔素描:

代码说明:

从图像生成卡通:

代码说明:

对图像应用双边滤波器:

代码说明:

整体输出:

其他方式:


图像到卡通

在当今世界,我们被图像和视频所包围。从社交媒体到广告,图像已成为一种强大的交流媒介。但是你有没有想过如果你能把你的照片变成卡通会发生什么?想象一下,为您最喜欢的照片创建动画版本,或者将肖像变成异想天开的插图。

在本文中,我们将探索如何使用 Python 中的 OpenCV 库将图像变成卡通。OpenCV 是一个功能强大的计算机视觉库,为图像和视频处理提供了广泛的功能,包括边缘检测、颜色转换和过滤。我们将使用这些工具在给定图像上创建卡通效果。

为此,我们将首先导入必要的模块并加载输入图像。接下来,我们将对图像应用一系列变换,包括边缘检测、颜色量化和双边滤波。最后,我们将结合这些变换在输入图像上创建卡通效果。在整篇文章中,我们将提供有关如何使用 OpenCV 实现每个转换的分步说明。到本文结束时,您将清楚地了解如何使用 OpenCV 在任何输入图像上创建卡通效果。因此,让我们深入了解如何使用 OpenCV 将图像转换为卡通!

导入必要的库:

import cv2
import numpy as np
import os

代码说明:

  • import cv2导入 OpenCV 库,它提供了广泛的图像和视频处理功能。
  • import numpy as np导入 NumPy 库,这是一个流行的库,用于在 Python 中处理数组和矩阵。
  • import os导入 os 模块,它提供了一种与文件系统交互的方法。

总体而言,此代码导入了在 Python 中使用 OpenCV 执行图像处理所需的模块。

在 Python 中使用 OpenCV 显示输入图像:

img = cv2.imread('original_picture.jpg')
cv2.imshow("original", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

原图

代码说明:

  • cv2.imread('original_picture.jpg')将名为“original_picture.jpg”的输入图像加载到名为 的变量中img。这是您想要的图片的名称。
  • cv2.imshow("original", img) 在标题为“原始”的窗口中显示输入图像。
  • cv2.waitKey(0)等待按键。参数 0 意味着程序将无限期地等待,直到按下一个键。
  • cv2.destroyAllWindows() 关闭所有打开的窗口。

使用 K-Means 聚类的颜色量化:

def color_quantization(img, k):
    # Transform the image
    data = np.float32(img).reshape((-1, 3))

    # Determine criteria
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.001)

    # Implementing K-Means
    ret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
    center = np.uint8(center)
    result = center[label.flatten()]
    result = result.reshape(img.shape)
    return result

功能说明:

  • 该函数有两个参数——输入图像img和簇数k
  • 输入图像首先使用 NumPy 库转换为像素值的二维数组。
  • 为 K-Means 聚类算法确定了一组标准,包括最大迭代次数和聚类中心的最小变化。
  • K-Means 聚类算法使用 cv2.kmeans() 函数应用于数据,具有指定的聚类数和标准。如果k变量发生变化,该函数将生成具有不同颜色簇数的新量化图像。较小的值k将导致量化图像具有较少的颜色,而较大的值k将导致量化图像具有更多的颜色。
  • 使用 NumPy 函数将生成的聚类中心转换为 8 位整数np.uint8()
  • 原始图像被展平为像素值的一维数组,每个像素被分配到其最近的聚类中心。
  • 然后将生成的像素值数组重新整形为原始输入图像的形状。
  • 生成的量化图像作为函数的输出返回。

创建边缘遮罩:

def edge_mask(img, line_size, blur_value):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray_blur = cv2.medianBlur(gray, blur_value)
    edges = cv2.adaptiveThreshold(gray_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, line_size, blur_value)
    return edges

功能说明:

  • 该函数采用三个参数——输入图像img、蒙版中线条的大小line_size以及要应用于灰度图像的模糊级别blur_value。如果line_size变量发生变化,则掩码中线条的大小将相应变化。较小的值会产生较细的线条,而较大的值会产生较粗的线条。
  • 输入图像首先使用cv2.cvtColor()函数转换为灰度。
  • 然后使用cv2.medianBlur()具有指定blur_value. 如果blur_value变量发生变化,应用于灰度图像的模糊程度也会发生变化。较小的值将导致较少的模糊,而较大的值将导致更多的模糊。
  • 通过使用函数对模糊的灰度图像应用自适应阈值来创建边缘蒙版cv2.adaptiveThreshold()。这种自适应阈值方法根据每个像素周围局部邻域中像素值的平均值计算每个像素的阈值。
  • 生成的边缘掩码作为函数的输出返回。

从图像生成铅笔素描:

line_size = 77
blur_value = 7

edges = edge_mask(img, line_size, blur_value)
cv2.imwrite('pencil_sketch.jpg', edges)
cv2.imshow('pencil sketch', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

铅笔素描

代码说明:

  • 代码首先将line_size和的值设置为 7。如果和blur_value的值发生变化,生成的铅笔草图将受到影响。较小的值会产生较细的线条,而较大的值会产生较粗的线条。同样,较小的值会导致较少的模糊,而较大的值会导致更多的模糊,这会影响铅笔素描的整体外观。line_sizeblur_valueline_sizeblur_value
  • img使用edge_mask()具有指定line_size和的函数从输入图像生成边缘掩码blur_value
  • 使用函数将生成的边缘蒙版保存为名为“pencil_sketch.jpg”的新图像文件cv2.imwrite()
  • 然后使用该函数显示铅笔素描图像cv2.imshow()
  • 该程序等待使用该功能的用户按下按键cv2.waitKey(0)
  • 最后,使用该函数关闭所有打开的窗口cv2.destroyAllWindows()

从图像生成卡通:

total_color = 99
img = color_quantization(img, total_color)
cv2.imwrite('cartoonize.jpg', img)
cv2.imshow('Cartoonize', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

卡通化图片

代码说明:

  • 代码首先将 的值设置total_color为 9。如果值发生total_color变化,生成的卡通图像将受到影响。较小的值total_color会导致较少的颜色,而较大的值会导致较多的颜色,这会影响卡通图像的整体外观。
  • 调用该color_quantization()函数以将输入图像中的颜色数减少img到指定的total_color.
  • 使用函数将生成的图像保存为名为“cartoonize.jpg”的新图像文件cv2.imwrite()
  • 然后使用该函数显示卡通图像cv2.imshow()
  • 该程序等待使用该功能的用户按下按键cv2.waitKey(0)
  • 最后,使用该函数关闭所有打开的窗口cv2.destroyAllWindows()

对图像应用双边滤波器:

bilateral = cv2.bilateralFilter(img, 15, 75, 75)15, 75, 75)
# Save the output.
cv2.imwrite('blur.jpg', bilateral)
img = cv2.imread('blur.jpg')
cv2.imshow("Blur", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

双边过滤

代码说明:

  • 代码首先使用img函数对输入图像应用双边滤波器cv2.bilateralFilter()。过滤器大小设置为 15,sigma 颜色和 sigma 空间的值都设置为 75。
  • 更改双边滤波器的内核大小、sigma 颜色和 sigma 空间的值将影响应用于图像的模糊级别。较小的内核大小和 sigma 值会导致较少的模糊,而较大的值会导致更多的模糊。更改这些值可以改变生成的模糊图像的整体外观。
  • 使用函数将生成的模糊图像保存为名为“blur.jpg”的新图像文件cv2.imwrite()
  • 然后使用函数将模糊图像加载回内存cv2.imread()并分配给img变量。

整体输出:

其他方式:

import cv2
import numpy as np

# 加载输入图像
img = cv2.imread('input_image.jpg')

# 应用双边滤波器平滑图像
img_smooth = cv2.bilateralFilter(img, 9, 75, 75)

# 将图像转换为grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 对灰度图像应用边缘检测 edges
edges = cv2.Canny(gray, 100, 200)

# 对平滑图像应用颜色量化
img_quant = cv2.cvtColor(img_smooth, cv2.COLOR_BGR2RGB)
Z = img_quant.reshape((-1,3))
Z = np.float32(Z)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 8
ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((img_quant.shape))

# 结合边缘和颜色量化创建卡通效果
cartoon = cv2.bitwise_and(res2, res2, mask=edges)

# 显示输出图像并保存
cv2.imshow('Cartoon', cartoon)
cv2.waitKey(0)
cv2.destroyAllWindows()

总之,使用 OpenCV 将图像转换为卡通是一种有趣且富有创意的方式,可以为您的照片赋予新的生命。在本文中,我们讨论了如何使用 OpenCV 通过应用各种图像处理技术(如颜色量化、边缘检测和双边滤波)将图像转换为卡通。通过结合这些技术,我们能够从普通照片中生成风格化的类似卡通的图像。

虽然本文提供的代码是一个很好的起点,但仍有许多方法可以自定义转换过程以获得不同的结果。尝试不同的参数值或应用额外的图像处理技术可以帮助创建独特且个性化的卡通风格图像。只要有一点创造力和一些图像处理技术知识,就有无限可能。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sonhhxg_柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值