opencv-python图像增强十六:图像马赛克

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在数字时代,图像处理已成为我们日常生活中不可或缺的一部分。无论是社交媒体上的照片编辑,还是专业领域的图像分析,图像处理技术都发挥着至关重要的作用。今天,我们将一起探索图像处理领域的一个有趣应用——图像马赛克。
马赛克作为一种艺术形式,自古以来就广受欢迎。它通过将小块的彩色材料拼接在一起,创造出美丽的图案和画面。而在数字图像处理中,马赛克效果则是一种将图像分解成若干小块,并通过某种方式(如平均颜色)重新组合的技术。这种效果不仅具有艺术价值,而且在隐私保护、数据压缩等方面有着广泛的应用。
在这篇博客中,我们将使用 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_size
        y_end = (i + 1) * block_size
        x_start = j * block_size
        x_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_size
        y_end = (i + 1) * block_size
        x_start = j * block_size
        x_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()

# 保存马赛克化的图像


四,效果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值