提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、算法流程:
- 二、算法实现:
- 2.1 生成背板图:
- 2.2 图片添加马赛克效果
- 三,整体代码实现:
- 四,效果:
前言
在数字时代,图像处理已成为我们日常生活中不可或缺的一部分。无论是社交媒体上的照片编辑,还是专业领域的图像分析,图像处理技术都发挥着至关重要的作用。今天,我们将一起探索图像处理领域的一个有趣应用——图像马赛克。
马赛克作为一种艺术形式,自古以来就广受欢迎。它通过将小块的彩色材料拼接在一起,创造出美丽的图案和画面。而在数字图像处理中,马赛克效果则是一种将图像分解成若干小块,并通过某种方式(如平均颜色)重新组合的技术。这种效果不仅具有艺术价值,而且在隐私保护、数据压缩等方面有着广泛的应用。
在这篇博客中,我们将使用 OpenCV 和 Python 这两大利器来实现图像的马赛克效果。OpenCV 是一个强大的计算机视觉库,它提供了丰富的图像处理功能。Python 则以其简洁明了的语法和强大的社区支持,成为了数据科学和机器学习领域的首选语言。
一、算法流程:
该算法流程首先读取并调整图像大小,然后通过将图像分割成指定大小的块,计算每个块的平均颜色,创建一个马赛克模板,并使用 NumPy 的 np.repeat 函数将模板扩展到整个图像大小,最终生成并显示马赛克化的图像
二、算法实现:
2.1 生成背板图:
首先将图像分割成指定大小的块,然后计算每个块的平均颜色,并将这些平均颜色填充到一个模板数组中,从而创建了一个马赛克化图像的模板。
代码实现:
height, width, channels = image.shape
# 设置马赛克块的大小
block_size = 10# 计算马赛克化后的图像大小
mosaic_height = height // block_size
mosaic_width = width // block_size# 初始化一个数组来保存马赛克化后的图像模板
mosaic_template = np.zeros((mosaic_height, mosaic_width, channels), dtype=np.uint8)# 遍历每个块,计算平均颜色,并填充模板
for i in range(mosaic_height):for j in range(mosaic_width):# 获取当前块的位置y_start = i * block_sizey_end = (i + 1) * block_sizex_start = j * block_sizex_end = (j + 1) * block_size# 获取当前块block = image[y_start:y_end, x_start:x_end]# 计算平均颜色mean_color = np.mean(block, axis=(0, 1))# 填充模板mosaic_template[i, j] = mean_color
原图:
生成的背板图:
2.2 图片添加马赛克效果
在获得背板图之后,若想要让图片获得马赛克效果,只需要对背板图的每个像素进行复制并扩增,将背板扩增到原图大小后即可实现马赛克效果,本次扩增选择的函数numpy.repeat(a, repeats, axis=None)
函数参数:
a: 要重复的输入数组。
repeats: 每个元素重复的次数。如果 repeats 是一个整数,那么数组 a 中的所有元素都会重复那么多次;如果 repeats 是一个数组,那么 a 中的每个元素将按照 repeats 中对应元素的值重复相应的次数。
axis: 指定沿着哪个轴进行重复。如果 axis 为 None(默认值),那么 a 将被扁平化成一维数组,然后每个元素都会按照 repeats 指定的次数进行重复;如果指定了 axis,则沿着该轴进行重复操作。
使用代码:
mosaic_image = np.repeat(np.repeat(mosaic_template, block_size, axis=0), block_size, axis=1)
三,整体代码实现:
代码如下(示例):
import cv2
import numpy as np# 读取图像
image_path = r'F:\traditional_vison\1.jpg'
image = cv2.imread(image_path)
image = cv2.resize(image,(0,0),fx=0.5,fy=0.5)
# 获取图像的宽度和高度
height, width, channels = image.shape# 设置马赛克块的大小
block_size = 10# 计算马赛克化后的图像大小
mosaic_height = height // block_size
mosaic_width = width // block_size# 初始化一个数组来保存马赛克化后的图像模板
mosaic_template = np.zeros((mosaic_height, mosaic_width, channels), dtype=np.uint8)# 遍历每个块,计算平均颜色,并填充模板
for i in range(mosaic_height):for j in range(mosaic_width):# 获取当前块的位置y_start = i * block_sizey_end = (i + 1) * block_sizex_start = j * block_sizex_end = (j + 1) * block_size# 获取当前块block = image[y_start:y_end, x_start:x_end]# 计算平均颜色mean_color = np.mean(block, axis=(0, 1))# 填充模板mosaic_template[i, j] = mean_color# 使用 np.repeat 扩展模板到整个图像大小
mosaic_image = np.repeat(np.repeat(mosaic_template, block_size, axis=0), block_size, axis=1)
cv2.imshow('mosaic_template Image', mosaic_template)
cv2.imshow(' Image',image)
# 显示马赛克化的图像
cv2.imshow('Mosaic Image', mosaic_image)
cv2.waitKey(0)
cv2.destroyAllWindows()# 保存马赛克化的图像