图像处理与OpenCV应用

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

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485