使用计算机视觉转换水彩艺术中的图像
介绍
在本文中,我们将研究能够将图像更改为水彩艺术形式的应用程序,我们将仅使用计算机视觉操作,即不涉及任何机器学习技术,仅涉及精细的图像处理技术。
计算机视觉的现实应用
因此,在讨论该方法并跳转到代码部分之前,让我们首先讨论一下该项目中使用的技术如何在实际场景中提供帮助。
1.将图像卡通化:虽然在这个问题陈述中我们将研究水彩艺术,但最重要的是,如果我们能够微调参数,我们只需要复习相关的概念就可以解决这个问题。
2.应用过滤器:我们可以使用相同的技术选择各种过滤器,从人工智能市场的角度来看,这对 VR/AR 公司来说非常有用。
3.修改图像:现在市场上开发了许多应用程序,这些应用程序给图像带来了多种多样的效果,而这种滤波图像处理无疑有助于这些应用程序。
处理此问题的方法
在本文的这一部分中,我们将列出开发应用程序的所有有效步骤/阶段,该应用程序将使用计算机视觉操作将我们的原始图像转换为水彩效果艺术。
阶段 1:输入图像并调整其大小:我们都知道我们需要一个图像来执行计算机视觉概念,但是调整它的大小背后有一个严格的逻辑,让我们举个例子来解释这个原因,假设你将对一个图像的唯一分布进行操作,我们将使用3×3内核对图像进行操作,而在这种情况下,3×3内核将对图像的唯一分布进行不同的操作,以消除这种复杂性,并确保在每种类型的图像中,我们的结果应该是相同的,使用resize函数是一个很好的实践,这样我们的内核操作就可以有效地完成。
阶段 2:清除杂质:在这个阶段,我们将清除所有杂质,由于颜色变化,图像中的杂质将滞后于操作。可能是斑点或不均匀的像素分布,可能导致应用过滤器的延迟。为了从图像中去除这些杂质,我们有足够的功能,我们将在本阶段详细讨论它们。
阶段 3:应用过滤:在这个阶段,我们将对这个特定问题陈述中的图像应用我们想要的过滤器。我们将应用这些过滤技术,将真实图像转换为水彩画效果。为此,我们将执行一些过滤技术,如高斯或双边过滤。
阶段 4:调整艺术:在这个阶段,我们将调整以提供更精确的过滤结果,假设在应用所需的过滤器后,我们获得了模糊效果,以便去除我们将应用的图像锐化,如果我们得到的结果显示了一些松散的颜色,那么我们将通过管理图像的颜色对比度来应用去雾操作,从而获得结果的精细形式
导入库
import cv2
import numpy as np
import matplotlib.pyplot as plt
阶段 1:读取图像并调整大小
在这里,我们将首先读取示例图像并调整其大小,为了获得更好的体验,我们将使用两个示例图像来仔细检查我们的结果。
image = cv2.imread('sample.jpg')
plt.figure(figsize = [10, 10])
plt.title("Image");plt.axis('off');plt.imshow(image[:,:,::-1]);plt.show()
输出:
image = cv2.imread('sample2.jpg')
plt.figure(figsize = [10, 10])
plt.title("Image");plt.axis('off');plt.imshow(image[:,:,::-1]);plt.show()
输出
代码分解:
在这里,我们首先使用read函数读取了图像,请注意图像类型是**.webp**。
然后我们使用 Matplotlib 库中的figure函数来设置图形大小。
最后,我们将使用show方法简单地显示图像。
调整图像大小
image_resized = cv2.resize(image, None, fx=0.5, fy=0.5)
关于resize函数
在这里,我们正在调整图像的大小,以便特定大小(比如 3×3)的内核将给出相同的结果,而与图像的分布无关。密切关注我们在 resize 函数中给出的参数。
image:这里我们传递我们想要调整大小的图像。
fx:这将有助于将 x 轴减半(因为值为 0.5)。
fy:这将有助于将 y 轴减半(因为值为 0.5)。
None:此选项会将高度和宽度操作设置为无,因为我们只是更改图像的轴。
阶段 2:去除/清除杂质
现在是我们清除杂质部分,我们将使用中值模糊算法,但稍后我们将应用双边过滤。
image_cleared = cv2.medianBlur(image_resized, 3)
image_cleared = cv2.medianBlur(image_cleared, 3)
image_cleared = cv2.medianBlur(image_cleared, 3)
image_cleared = cv2.edgePreservingFilter(image_cleared, sigma_s=5)
代码分解
1.在查看代码时,一个问题是确定的,即为什么我对图像进行了三次过滤?
· 答:我们想要过滤最多的图像,因此,我们需要过滤相同的图像多次(这里是三次),因此现在我们可以相对地获得过滤次数更多的图像。
2.除了中值模糊过滤外,我们还将研究边缘保留过滤,它负责保持整个图像的恒定颜色分布。
阶段 3:双边图像过滤
高斯滤波和双边图像滤波之间的主要区别在于,在高斯模糊中,它只适用于图像的模糊,即只考虑空间(不保留角点),但在双边滤波中,我们将使用图像的高斯核,这将反过来聚焦于更强烈的图像,并将保留角点。
image_filtered = cv2.bilateralFilter(image_cleared, 3, 10, 5)
for i in range(2):
image_filtered = cv2.bilateralFilter(image_filtered, 3, 20, 10)
for i in range(3):
image_filtered = cv2.bilateralFilter(image_filtered, 5, 30, 10)
代码分解
在分解代码之前,我们需要了解为什么我们使用循环进行双边过滤?
答:因为如果我们一次性增加参数值,那么我们将获得卡通图像而不是水彩艺术,这不是我们的目标,因此我们正在循环应用过滤并逐渐增加 sigma 空间的值。
参数 Bilateral filtering:
1.Source:需要过滤的源图像。
2.D:D是每个像素的直径值(这里是3/5)。
3.Sigma 颜色:Sigma 颜色的值越大,颜色混合得越深。
4.Sigma 空间:Sigma 空间的值越大,空间越宽的颜色就会开始混合。
阶段 4:调整艺术 - 锐化图像
所以,当我们使用双边滤波时,它用来模糊图像。它保留了图像的一角,并将其转换为模糊形式,以便消除这种情况,获得更清晰的输出,我们用来锐化图像。
gaussian_mask= cv2.GaussianBlur(image_filtered, (7,7), 2)
image_sharp = cv2.addWeighted(image_filtered, 1.5, gaussian_mask, -0.5, 0)
image_sharp = cv2.addWeighted(image_sharp, 1.4, gaussian_mask, -0.2, 10)
代码分解:
1.首先在高斯模糊的帮助下,我们将减去图像的一部分以获得高斯蒙版。
2.然后使用上面的高斯蒙版,我们将使用weighted()函数锐化图像,如果你注意到参数,我们正在尝试不同的alpha 和 gamma值以获得所需的结果。
使用计算机视觉显示图像
plt.figure(figsize=[30,30])
plt.subplot(131);plt.imshow(image_sharp[:,:,::-1]);plt.title("Final Image");plt.axis('off');
plt.subplot(132);plt.imshow(image_cleared[:,:,::-1]);plt.title("Clear Impurities");plt.axis('off');
plt.subplot(133);plt.imshow(image[:,:,::-1]);plt.title("Original");plt.axis('off');
输出 1:
输出 2:
代码分解
正如我们之前在文章中已经讨论过绘制图像一样,因此可以参考。这部分只有一点需要注意,这是一个子图,将图像的部分分为三个部分:
1.最终图像
2.清除杂质
3.原图
关于计算机视觉的结论
因此,从上面的输出中,你可以看到图像已转换为水彩画,你可以使用相同的过程和图像处理技术转换你想要的任何图像,为了确保图像质量足够好,可以应用过滤器。
1.在这里,我们学到的第一件事是关于调整大小的功能,这非常重要。
2.然后我们开始了解不同的算法和概念,这些算法和概念有助于清除图像中的杂质。
3.最后,我们了解了如何对处理进行最后的处理,即调整图像,以提高结果的质量。