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 | 内容创作。