python图像处理 ——图像分块

news2024/11/29 10:41:34

python图像处理 ——图像分块

  • 前言
  • 一、分块与合并
    • 1.读取原始图像
    • 2.网格划分,将图像划分为m*n块
    • 3.网格合并
  • 二、代码

前言

根据图像尺寸创建一个 ( m + 1 ) × ( n + 1 ) 个均匀的网格顶点坐标,对于图像块来说每个图像块的左上角和右下角可以唯一确定一个图像块,这样就可以利用网格顶点坐标对原始图像进行裁剪。

一、分块与合并

1.读取原始图像

在这里插入图片描述

2.网格划分,将图像划分为m*n块

def split_image(image, num_blocks):
    height, width = image.shape[:2]
    block_size = int(min(height, width) / num_blocks)
    block_images = []
    for i in range(num_blocks):
        for j in range(num_blocks):
            x1, y1 = i * block_size, j * block_size
            x2, y2 = x1 + block_size, y1 + block_size
            block_image = image[x1:x2, y1:y2]
            block_images.append((i*num_blocks+j, block_image))
    return block_images

这段代码实现了将一个二维图像切分为多个块的功能。

函数名为 split_image,它有两个参数:image 为需要切分的图片,num_blocks 为需要切分的块数。

(1)通过 shape 属性获取图片的高度 height 和宽度 width。然后通过 min() 函数计算出一个块的大小 block_size,即取高度和宽度中较小值再除以块数。
(2)通过双重循环遍历所有块的位置,每次循环计算块的左上角 (x1, y1) 和右下角 (x2, y2) 的坐标,然后用 NumPy 的切片操作 image[x1:x2, y1:y2] 获取一个块的图像数据,并将其存入 block_images 列表中。
(3)最后返回切分好的块列表 block_images,以及原图片的高度和宽度。

3.网格合并

def merge_images(block_images, num_blocks):
    block_size = block_images[0].shape[0]
    image_size = block_size * num_blocks
    merged_image = np.zeros((image_size, image_size, 3), dtype=np.uint8)
    for i in range(num_blocks):
        for j in range(num_blocks):
            x1, y1 = i * block_size, j * block_size
            x2, y2 = x1 + block_size, y1 + block_size
            merged_image[x1:x2, y1:y2] = block_images[i * num_blocks + j]
    return merged_image

这段代码定义了一个名为merge_images的函数,该函数用于将多个图像块合并成一个完整的图像。

函数的参数block_images是一个包含多个图像块的列表,每个图像块都是一个二维数组,表示该块在完整图像中的位置和大小。参数num_blocks表示完整图像被分成多少个块。

(1)函数通过block_images[0].shape[0]获取第一个图像块的高度(或宽度),作为每个块的大小。然后,计算完整图像的大小,即 image_size = block_size * num_blocks。
(2)函数创建一个全黑的数组merged_image,用于存放合并后的完整图像。该数组的大小为(image_size, image_size, 3),其中3表示颜色通道数,dtype=np.uint8表示每个像素点使用8位无符号整数来表示。
(3)函数使用两个嵌套循环遍历所有的图像块,并计算出该块在完整图像中的位置。这里使用了变量i和j来表示当前处理的块的行和列索引,使用变量x1、y1、x2和y2来表示当前块在完整图像中的左上角和右下角位置。
(4)函数将当前块的像素值复制到merged_image数组的相应位置,完成了合并操作。最后返回合并后的完整图像数组。
在这里插入图片描述

二、代码

import cv2
import numpy as np
from matplotlib import pyplot as plt
def split_image(image, num_blocks):
    height, width = image.shape[:2]
    block_size = int(min(height, width) / num_blocks)
    block_images = []
    for i in range(num_blocks):
        for j in range(num_blocks):
            x1, y1 = i * block_size, j * block_size
            x2, y2 = x1 + block_size, y1 + block_size
            block_image = image[x1:x2, y1:y2]
            block_images.append(block_image)
    return block_images, height, width

def merge_images(block_images, num_blocks):
    block_size = block_images[0].shape[0]
    image_size = block_size * num_blocks
    merged_image = np.zeros((image_size, image_size, 3), dtype=np.uint8)
    for i in range(num_blocks):
        for j in range(num_blocks):
            x1, y1 = i * block_size, j * block_size
            x2, y2 = x1 + block_size, y1 + block_size
            merged_image[x1:x2, y1:y2] = block_images[i * num_blocks + j]
    return merged_image

image = cv2.imread("pepper.png")
num_blocks = 4
block_images, rows, cols = split_image(image, num_blocks)

# 遍历所有分块,将其显示在subplot中
for i in range(len(block_images)):
    plt.subplot(num_blocks, num_blocks, i+1)
    plt.imshow(cv2.cvtColor(block_images[i], cv2.COLOR_BGR2RGB))
plt.show()

# 合并分块后的图像并显示
merged_image = merge_images(block_images, num_blocks)
plt.imshow(cv2.cvtColor(merged_image, cv2.COLOR_BGR2RGB))
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1174621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

路由过滤路由引入

目录 一、实验拓扑 二、实验需求 三、实验步骤 1、配置IP地址 2、配置RIP和OSPF 3、配置路由引入 4、使用路由过滤,使 R4 无法学到 R1 的业务网段路由,要求使用 prefix-list 进行匹配 5、OSPF 区域中不能出现 RIP 协议报文 一、实验拓扑 二、实…

【Linux】:Linux项目自动化构建工具——make/Makefile || Linux第一个小程序——进度条(简单版本)

在本章开始给大家分享一个图片 希望对你有帮助 在这里插入图片描述 🏆前言 在开始本章之前 我们需要回顾一下上节课的函数的动静态库的优缺点 动态库的优点: 比较节省资源(这里说的资源不仅仅是磁盘资源 也包括网络资源 内存资源等等&#…

SpringBoot项目多环境开发

1.yml文件(旧) 说明:旧的写法。 #应用环境 spring:profiles:active: dev --- #设置环境#生产环境 spring:profiles: pro server:port: 81--- #开发环境 spirng:profiles: dev server:port: 81--- #测试环境 spring:profiles: test server:p…

修改一下第二次课服务枚举等问题

关于AutoRuns 的总结里面,有个错误,Image hijacks 这个准确的描述应该是镜像劫持 和系统运行相关的image,我们通常指的是二进制镜像文件 Image hijacks镜像劫持 简单来说就是,在注册表中,有部分设置,是规…

阿里云二级域名绑定与宝塔Nginx反向代理配置

在阿里或者腾讯...各大域名商买好域名,备案解析好,目标URL,是真正的地址,比如一些端口,后者会自动填写。 注意ssl配置好,这里不要带反代端口

分享一次无线话筒和接收机的配对经历BK9521/9522

最近老婆喜欢上了唱歌。我就需要为她准备歌曲和设备。装了台点歌机,买了软件,用4天的时间下了4T容量的歌曲,听过的没听过的都在里面,真的是太多了。 有了歌曲,就要有唱歌设备了。当我准备买无线话筒的时候&#xff0c…

Javascript知识点详解:正则表达式

目录 RegExp 对象 概述 实例属性 实例方法 RegExp.prototype.test() RegExp.prototype.exec() 字符串的实例方法 String.prototype.match() String.prototype.search() String.prototype.replace() String.prototype.split() 匹配规则 字面量字符和元字符 转义符…

5.数据表基本操作

目录 1.创建数据表 创建数据表的语法格式: 查看当前数据库的表: 主键 1.单字段主键 (1)在定义列的同时指定主键,语法规则如下: (2)在定义完所有列之后指定主键。 2.多字段联合主键 外键: 非空约束&#xff1…

用户态内存映射

内存映射不仅仅是物理内存和虚拟内存之间的映射,还包括将文件中的内容映射到虚拟内存空间。这个时候,访问内存空间就能够访问到文件里面的数据。而仅有物理内存和虚拟内存的映射,是一种特殊情况。 对于堆的申请来讲,mmap 是映射内…

试试流量回放,不用人工写自动化测试case了

大家好,我是洋子,接触过接口自动化测试的同学都知道,我们一般要基于某种自动化测试框架,编写自动化case,编写自动化case的依据来源于接口文档,对照接口文档里面的请求参数进行人工添加接口自动化case 其实…

应用安全四十二:SSO安全

一、什么是SSO SSO是单点登录(Single Sign On)的缩写,是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗,辅助了用户管理,是比较流行的企业业务整合的解决方案之一。 身份验证过程依赖于双方之间的信任关…

大数据毕业设计选题推荐-智慧小区大数据平台-Hadoop-Spark-Hive

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

2022年ISSCC会议报告分析

Tutorial Fundamentals of Self-Sensing Processor Systems AMD Zen架构的CCD die中有很多传感器检测die的频率、电压、电压和温度 HBM DRAM and 3D Stacked Memory Advances in Digital vs. Analog AI Accelerators Nvidia的Multi-chip架构的DNN加速器 Form1: Compute-in…

Pycharm-community-2021版安装和配置

一、下载Pycharm-community-2021 1.从官网下载pycharm-community Pycharm 版本官网 二、安装PyCharm 1.打开下载完成的安装包,点击Next 2.安装PyCharm到其他位置,点击Next 3.一定把更新PATH变量勾上,可以创建桌面快捷方式,创建关联,最后…

apache-maven-3.6.3 安装配置教程

链接:https://pan.baidu.com/s/1RkMXipnvac9EKcZyUStfGQ?pwdl32m 提取码:l32m 1. 将 maven 压缩包解压至指定文件夹 2. 配置环境变量 (1)打开此电脑-> 鼠标右键选择属性->点击高级系统设置 (2)点…

【移远QuecPython】EC800M物联网开发板的硬件PWM和PWM输出BUG

【移远QuecPython】EC800M物联网开发板的硬件PWM和PWM输出BUG 文章目录 导入库初始化PWM开启PWMPWM硬件BUG附录:列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 导入库 from misc import PWM_V2或者 from misc import PWM但我觉得PWM_V2好用 初…

嵌入式中如何把C++代码改写成C语言代码

由于C++解释器比C语言解释器占用的存储空间要大500k左右。为了节省有限的存储空间、降低成本,同时也为了提高效率,将用C++语言写的源程序用C语言改写是很有必要的。 C++与C最大的区…

高位片选与低位交叉编址、芯片扩展与多模块存储器、多通道内存

多模块存储器 是一种空间并行技术,利用多个结构完全相同的存储模块的并行工作来增加存储器的吞吐率。根据不同的编址方式,多模块存储器分为连续编址和交叉编址两种结构 连续编址方式:主存地址的高位表示模块号(体号)…

Python--快速入门二

Python--快速入门二 1.Python数据类型 1.可以通过索引获取字符串中特定位置的字符: a "Hello" print(a[3]) 2.len函数获取字符串的长度: a "Hello" print(a) print(len(a)) 3.空值类型表示完全没有值: 若不确定当…

【嵌入式项目应用】__物联网小知识:不同通讯线的通讯距离是多少,你知道吗?

目录 前言 不同协议通讯线的传输距离 无线传输协议与距离 1. 蓝牙 2. Zigbee 3. LoRa 4. Wi-Fi 5. 蜂窝网络 6. Sigfox 7. LoRaWAN (* ̄︶ ̄)创作不易!期待你们的 点赞、收藏和评论喔。 前言 在物联网中,通讯线的作用是…