当前位置: 首页 > 科技观察

一键进入二次元!使用Python将自拍转换为卡通风格

时间:2023-03-12 16:31:08 科技观察

如今,绘制草图或创建漫画不必手动完成,并且有许多应用程序可以将您的照片转换为卡通风格。它并没有你想象的那么难,只需要几行代码就可以达到预期的效果。有一个名为OpenCV的库,它为计算机视觉应用程序提供了一个通用的基础设施,并针对机器学习算法进行了优化。它可用于识别物体、检测和生成高分辨率图像。本教程将展示如何使用OpenCV在Python中为图像赋予卡通外观。本教程将使用GoogleColab编写和运行代码。要创建卡通效果,您需要注意两件事:边缘和调色板。这就是照片和卡通图片的区别。要调整这两点,我们将通过四个主要步骤:加载图像创建边缘蒙版减少调色板将边缘蒙版与颜色处理后的图像结合在开始之前,不要忘记导入所需的库,尤其是cv2和NumPy。defread_file(文件名):img=cv2.imread(文件名)cv2_imshow(img)returnimg1。加载图像第一步是加载图像。定义read_file函数,其中包括cv2_imshow,以加载我们在GoogleColab中选择的图像。defread_file(filename):img=cv2.imread(filename)cv2_imshow(img)returnimgcallcreatedfunctiontoloadimage:uploaded=files.upload()filename=next(iter(uploaded))img=read_file(filename)i选择到将下面的图像变成卡通图像:2.创建边缘遮罩一种常见的卡通效果强调图像中边缘的厚度。cv2.adaptiveThreshold()函数可以检测图像中的边缘。我们可以将egde_mask函数定义为:defedge_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)returnedges在这个函数中,我们将图像转换为灰度图,然后使用cv2.medianBlur来降低模糊灰度图的噪声。较大的模糊值意味着图像中出现的黑色噪声较少。接下来,应用adaptiveThreshold函数来定义边缘的线宽。较粗的线条意味着图像中强调的较粗的边缘。定义函数后,调用函数查看结果。line_size=7blur_value=7edges=edge_mask(img,line_size,blur_value)cv2_imshow(edges)edgemaskdetection3.减少调色板在颜色方面,照片和草图的主要区别在于每种颜色的数量。草图的颜色比照片少。因此,我们使用颜色量化来减少照片中的颜色数量。为了执行颜色量化,我们应用了OpenCV库提供的K均值聚类算法。为了在接下来的步骤中更方便的使用,可以这样定义color_quantization函数:defcolor_quantization(img,k):#Transformtheimagedata=np.float32(img).reshape((-1,3))#Determinecriteriacriteria=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,20,0.001)#ImplementingK-Meansret,label,center=cv2.kmeans(data,k,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)center=np.uint8(中心)结果=中心[标签。flatten()]resultresult=result.reshape(img.shape)returnresult可以调整k值以确定要应用于图像的颜色数量:total_color=9img=color_quantization(img,total_color)在这个例子中,k图像的值设置为9。结果如下:颜色量化后颜色量化后,可以通过双边滤波降低图像中的噪声。这会使图像略微模糊且不那么清晰。blurred=cv2.lateralFilter(img,d=7,sigmaColor=200,sigmaSpace=200)这里一共有三个参数,大家可以根据自己的喜好进行调整。d——每个像素邻域的直径。sigmaColor——该参数的值越大,表示半等色的区域越大。sigmaSpace——这个参数的值越大意味着越远的像素只要它们的颜色足够接近就会相互影响。使用双边滤波后4.将边缘蒙版与彩色处理后的图像结合最后一步是将我们之前创建的边缘蒙版与彩色处理后的图像结合起来。为此,请使用cv2.bitwise_and函数。cartoon=cv2.bitwise_and(blurred,blurred,mask=edges)这是原始图片的“卡通版”:最终效果现在你可以开始创建自己的卡通效果了。除了调整我们上面使用的参数值外,您还可以从OpenCV添加另一个功能来为您的照片添加特殊效果,库中还有很多值得探索的地方。快乐尝试!