OpenCV是一个开源的计算机视觉库,广泛应用于图像处理、机器学习和深度学习领域。它可以用来进行目标检测、分类、手写分析等多种任务。OpenCV可以与Numpy等库集成,用于各种数学计算。计算机视觉的主要目的是理解图像。
使用OpenCV,可以执行许多任务,比如读取和写入图像、图像处理、捕获和保存视频、特征检测等。OpenCV代表开源计算机视觉库,是使用Python进行计算机视觉的最流行库。OpenCV对所有人免费使用,因此被用于各种项目和应用。
给图像添加卡通效果:许多应用和网站提供了给图像添加卡通效果的工具。年轻一代喜欢这个功能,它在社交媒体上也非常流行。在这些应用中,只需上传图像,就会返回带有所需效果的图像。
但是,有没有想过它们是如何工作的?要实现这一点,需要进行多次图像转换。在进行此操作时需要考虑的一些重要事项是边缘和色彩调色板。让继续编码。
import cv2
import numpy as np
import matplotlib.image as img
from matplotlib import pyplot as plt
主要需要OpenCV和NumPy。现在,让读取图像。
# 读取图像
img = cv2.imread("person.jpeg")
已经将图像作为输入。让看看图像的数据类型。
# 图像类型
type(img)
输出:numpy.ndarray 因此,图像基本上是一个多维的NumPy数组。
边缘蒙版
在卡通效果中,通常非常强调图像边缘的厚度。可以使用cv2.adaptiveThreshold()函数检测边缘。在处理边缘之前,需要将图像转换为灰度。然后,使用cv2.medianBlur函数减少灰度图像的噪声。让继续编码:
# 创建边缘蒙版
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
line_size = 7
blur_value = 7
线大小和模糊值也已定义。为了强调更粗的边缘,采用了更大的线大小。让获取边缘。
edges = edge_mask(img, line_size, blur_value)
现在,保存图像。
filename = 'edges.jpg'
cv2.imwrite(filename, edges)
输出:可以看到边缘被检测到。
减少色彩调色板
照片和素描/卡通之间的一个关键区别是不同颜色的数量。与高清照片相比,卡通素描的颜色要少得多。因此,使用名为色彩量化的方法。这将减少照片中的颜色数量。
K均值聚类算法用于执行此过程。“k”值根据需要的颜色数量进行调整。
# 色彩量化
total_color = 8
k = total_color
在这种情况下,k的值被取为8。
# 转换图像
data = np.float32(img).reshape((-1, 3))
接下来,转换图像。
# 确定标准
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.001)
现在,实现K均值。
# 实施K均值
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)
让保存图像。
filename = 'colour.jpg'
cv2.imwrite(filename, result)
输出:好的,现在看到了效果。
减少图像噪声
色彩量化完成后,现在可以减少图像中的噪声。可以使用双边滤波器来完成此任务。结果图像将略微模糊,图像清晰度将降低。
blurred = cv2.bilateralFilter(result, d=10, sigmaColor=250, sigmaSpace=250)
让保存图像,看看它看起来如何。
filename = 'blurred.jpg'
cv2.imwrite(filename, blurred)
输出:完成此操作后,现在进行最终的卡通效果。
# 模糊和边缘
cartoon = cv2.bitwise_and(blurred, blurred, mask=edges)
现在,保存图像。
filename = 'cartoon.jpg'
cv2.imwrite(filename, cartoon)
让看看图像的样子。输出非常好。图像被赋予了有趣的效果。OpenCV可以创造奇迹,进行有趣的图像转换。
现在让尝试一些其他的事情,这次将使用轮廓。
首先,正确定义函数。首先是色彩量化函数。
# 色彩量化
def ColourQuantization(image, K=9):
Z = image.reshape((-1, 3))
Z = np.float32(Z)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)
compactness, label, center = cv2.kmeans(Z, K, None, criteria, 1, cv2.KMEANS_RANDOM_CENTERS)
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((image.shape))
return res2
在这里,对于KMeans,K的值被取为9。
现在让定义用于轮廓的函数。
# 获取轮廓
def Countours(image):
contoured_image = image
gray = cv2.cvtColor(contoured_image, cv2.COLOR_BGR2GRAY)
edged = cv2.Canny(gray, 200, 200)
contours, hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[-2:]
cv2.drawContours(contoured_image, contours, contourIdx=-1, color=6, thickness=1)
return contoured_image
在这个函数中,首先将图像转换为灰度,然后检测边缘。最后,也制作了轮廓。
现在,让使用这个函数。
image = cv2.imread("person1.jpeg")
coloured = ColourQuantization(image)
contoured = Countours(coloured)
final_image = contoured
在此之后,保存图像。
filename = 'cartoon_final.jpg'
cv2.imwrite(filename, final_image)
输出:在这种情况下,输出也很有趣。
通过改变各种参数,可以修改卡通效果。
说到用途,目前这些处理方法主要用于社交媒体和艺术目的。人们可以对他们的图像进行有趣的编辑,并在社交媒体上发布。
要查看代码,请访问这个链接。
关于:Prateek Majumder,数据科学和分析 | 数字营销专家 | SEO | 内容创作。