python图像处理 ——图像分块

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_sizex2, y2 = x1 + block_size, y1 + block_sizeblock_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_blocksmerged_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_sizex2, y2 = x1 + block_size, y1 + block_sizemerged_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_sizex2, y2 = x1 + block_size, y1 + block_sizeblock_image = image[x1:x2, y1:y2]block_images.append(block_image)return block_images, height, widthdef merge_images(block_images, num_blocks):block_size = block_images[0].shape[0]image_size = block_size * num_blocksmerged_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_sizex2, y2 = x1 + block_size, y1 + block_sizemerged_image[x1:x2, y1:y2] = block_images[i * num_blocks + j]return merged_imageimage = 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.mzph.cn/news/132458.shtml

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

相关文章

react+canvas实现横跨整个页面的动态的波浪线(贝塞尔曲线)

本来写这个特效 我打算用css实现的,结果是一波三折,我太难了,最终没能用css实现,转战了canvas来实现。来吧先看效果图 当然这个图的波浪高度、频率、位置、速度都是可调的,请根据自己的需求调整,如果你讲波…

前端框架Vue学习 ——(六)Vue组件库Element

文章目录 Element 介绍快速入门常见组件表格分页Dialog 对话框组件表单 Container 布局容器 Element 介绍 Element:是饿了么团队研发的,一套为开发者、 设计师和产品经理准备的基于Vue 2.0的桌面端组件库。 组件:组成网页的部件,…

【Unity】2D角色跳跃控制器

最近加了学校的Nova独游社,本文是社团出的二面题,后续有时间优化下可能会做成一个二维冒险小游戏。本文主要涉及相关代码,参考教程:《勇士传说》横版动作类游戏开发教程 效果演示 【Unity】2D角色跳跃模拟器 主要实现功能&#xf…

CV计算机视觉每日开源代码Paper with code速览-2023.11.2

精华置顶 墙裂推荐!小白如何1个月系统学习CV核心知识:链接 点击CV计算机视觉,关注更多CV干货 论文已打包,点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【目标检测】Re-Scoring Using Image-Language Similarit…

Spring Boot 整合SpringSecurity和JWT和Redis实现统一鉴权认证

📑前言 本文主要讲了Spring Security文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 🌄每日一句:努力…

多功能声学综合馆:空间的“膜法师”

建筑是文明的承载者,是历史的见证者,也是城市的象征。但在现代都市中,我们不仅需要“固定”的建筑,更需要灵活与多功能性的空间。而这,正是多功能声学综合馆为我们带来的“膜法”。 不仅仅是建筑,更是艺术的…

【技术干货】开源库 Com.Gitusme.Net.Extensiones.Core 的使用

目录 1、项目介绍 2、为项目添加依赖 3、代码中导入命名空间 4、代码中使用 示例 1:string转换 示例 2:object转换 1、项目介绍 Com.Gitusme.Net.Extensiones.Core是一个.Net扩展库。当前最新版本1.0.4,提供了常见类型转换&#xff0c…

Amazon EC2 安全可调用的云虚拟主机服务器

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Amazon EC2 打造全新的科技链 Amazon Elastic Compute Cloud(Amazon EC2)提供最广泛、最深入的计算平台,拥有超过 500 个实例&…

服务器经常被攻击的原因

很多中小型企业都是选择虚拟主机服务器,是把一个服务器分成很多个给很多企业一起共用,可能同一个 IP服务器上就有很多个不同企业的网站,这个时候如果跟你同一个IP服务器的网站遭到DDoS攻击,就很有可能会影响到你的网站也无法正常访…

Java中各个版本JDK分别有哪些常见的垃圾回收算法?它们的适用场景和开启方法是什么?

Java中各个版本JDK分别有哪些常见的垃圾回收算法?它们的使用场景和开启方法是什么? 1.1 JDK 1.8 中的垃圾回收算法1.2 JDK 11 中的垃圾回收算法1.3 JDK17中的垃圾回收算法 1.1 JDK 1.8 中的垃圾回收算法 Java 8引入了一些不同类型的垃圾回收算法&#x…

nginx配置支持PHP

前言 Nginx是通过php-fpm来通信的,所以需要修改的监听9000端口。 当 Nginx 配置支持 PHP 时,它可以将 PHP 请求转发给 PHP-FPM,由 PHP-FPM 处理请求并返回结果。 要配置 Nginx 支持 PHP,你需要在 Nginx 配置文件中添加一个 locat…

awk精确筛选

awk精确筛选: $(><):用于对比数值 $n~"字符串"代表第n个字段包括某个字符 $n!~"字符串"代表第n个字段不包括某个字符 $n"字符串"代表第n个字段为某个字符 $n!"字符串"代表第n个字段不为某个字符 $NF:最后一个字段 awk -F…

044_第三代软件开发-保存PDF

第三代软件开发-保存PDF 文章目录 第三代软件开发-保存PDF项目介绍保存PDF头文件源文件使用 关键字&#xff1a; Qt、 Qml、 pdf、 painter、 打印 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Language&#xff…

【Windows-软件-FFmpeg】(01)通过CMD运行FFmpeg进行操作,快速上手

前言 通过"cmd"运行"ffmpeg"进行操作&#xff0c;快速上手&#xff1b; 实操 【实操一】 说明 使用"ffmpeg"来合并音频文件和视频文件 &#xff1b; 环境 Windows 11 专业版&#xff08;22621.2428&#xff09;&#xff1b; 代码 &#xf…

Java 性能优化之直接使用成员变量 VS 拷贝副本

背景 刷到一个大佬的 CSDN 博客&#xff0c;仔细看了一下性能优化专栏。联想到我们的日常开发工作&#xff0c;由于业务比较简单&#xff0c;很容就忽略性能问题。但是&#xff0c;性能优化的一下常见思路&#xff0c;也早有耳闻。看了一个 Java 性能优化的方法 「减少操作指令…

Linux进程的优先级

Linux进程的优先级 &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解Linux中进程的优先级&#xff0…

安防监控系统EasyCVR视频汇聚平台,如何实现视频汇聚?

关注我们的朋友都知道&#xff0c;EasyCVR平台最初就是以汇聚为核心而进行打造的&#xff0c;那到底什么是汇聚平台呢&#xff1f;又如何进行视频资源汇聚&#xff1f;简单来说&#xff0c;视频汇聚平台是指能够从不同的视频源&#xff08;例如直播、点播等&#xff09;收集、整…

Nginx篇---第二篇

系列文章目录 文章目录 系列文章目录一、请列举Nginx和Apache 之间的不同点二、在Nginx中,如何使用未定义的服务器名称来阻止处理请求?三、请解释Nginx服务器上的Master和Worker进程分别是什么?一、请列举Nginx和Apache 之间的不同点 二、在Nginx中,如何使用未定义的服务器…

[移动通讯]【Carrier Aggregation-13】【Carrier Aggregation】

前言&#xff1a; 前面分享过不同note CA 技术文档 这里主要参考 4G|ShareTechnote 《Carrier Aggregation》 CA SCell 添加的小区的流程&#xff1a; SCell addition and removal&#xff1a; 1 The carrier aggregation additional SCells cannot be activated immediately…

pom.xml详解

我们在开发Java应用程序时&#xff0c;pom.xml文件是项目中的核心配置文件之一&#xff0c;它结合Maven实现对项目依赖的拉取&#xff0c;今天就详细了解一下pom.xml文件的配置 Maven是一种构建工具&#xff0c;它用于构建、管理和发布Java项目pom.xml文件包含了项目的所有重要…