用Python语言对任意图像进行m*n的均匀分块(思路非常清晰,步骤简单)

主要用途:处理图片数据集

 1 对单个图片进行分块

import numpy as np
import matplotlib.pyplot as plt
import cv2def divide_method1(img,m,n):#分割成m行n列print(img.shape)h, w = img.shape[0],img.shape[1]gx = np.round(h).astype(np.int)gy = np.round(w).astype(np.int)divide_image = np.zeros([m-1, n-1, int(h*1.0/(m-1)+0.5), int(w*1.0/(n-1)+0.5),3], np.uint8)#这是一个五维的张量,前面两维表示分块后图像的位置(第m行,第n列),后面三维表示每个分块后的图像信息for i in range(m-1):for j in range(n-1):print(i)print(j)#这样写比a[i,j,...]=要麻烦,但是可以避免网格分块的时候,有些图像块的比其他图像块大一点或者小一点的情况引起程序出错print(img[gy[i][j]:gy[i+1][j+1], gx[i][j]:gx[i+1][j+1],:])divide_image[i,j,0:gy[i+1][j+1]-gy[i][j], 0:gx[i+1][j+1]-gx[i][j],:]= img[gy[i][j]:gy[i+1][j+1], gx[i][j]:gx[i+1][j+1],:]return divide_imagedef divide_method2(img,m,n):#分割成m行n列h, w = img.shape[0],img.shape[1]grid_h=int(h*1.0/(m-1)+0.5)#每个网格的高grid_w=int(w*1.0/(n-1)+0.5)#每个网格的宽#满足整除关系时的高、宽h=grid_h*(m-1)w=grid_w*(n-1)#图像缩放img_re=cv2.resize(img,(w,h),cv2.INTER_LINEAR)# 也可以用img_re=skimage.transform.resize(img, (h,w)).astype(np.uint8)#plt.imshow(img_re)gx, gy = np.meshgrid(np.linspace(0, w, n),np.linspace(0, h, m))gx=gx.astype(np.int_)gy=gy.astype(np.int_)divide_image = np.zeros([m-1, n-1, grid_h, grid_w,3], np.uint8)#这是一个五维的张量,前面两维表示分块后图像的位置(第m行,第n列),后面三维表示每个分块后的图像信息for i in range(m-1):for j in range(n-1):divide_image[i,j,...]=img_re[gy[i][j]:gy[i+1][j+1], gx[i][j]:gx[i+1][j+1],:]return divide_imagedef display_blocks(divide_image):#m,n=divide_image.shape[0],divide_image.shape[1]for i in range(m):for j in range(n):plt.imshow(divide_image[i,j,:])plt.axis('off')plotPath= str(i)+str(j)+'.jpg' # 图片保存路径plt.savefig("./1/"+plotPath)img = cv2.imread('./video_01/12-13 (1).jpg') # 图片地址
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
h, w = img.shape[0], img.shape[1]m=8
n=8
divide_image2=divide_method2(img,m+1,n+1)#该函数中m+1和n+1表示网格点个数,m和n分别表示分块的块数
fig3 = plt.figure('分块后的子图像:图像缩放法')
display_blocks(divide_image2)

2 对文件夹内的全部图片进行分块操作

import numpy as np
import matplotlib.pyplot as plt
import cv2
import os# 边里该文件夹下的文件名称
def read_directory(directory_name):file_list = []for filename in os.listdir(directory_name):str = directory_name+'/'+filenamefile_list.append(str)return file_listdef divide_method1(img,m,n):#分割成m行n列print(img.shape)h, w = img.shape[0],img.shape[1]gx = np.round(h).astype(np.int)gy = np.round(w).astype(np.int)divide_image = np.zeros([m-1, n-1, int(h*1.0/(m-1)+0.5), int(w*1.0/(n-1)+0.5),3], np.uint8)#这是一个五维的张量,前面两维表示分块后图像的位置(第m行,第n列),后面三维表示每个分块后的图像信息for i in range(m-1):for j in range(n-1):print(i)print(j)#这样写比a[i,j,...]=要麻烦,但是可以避免网格分块的时候,有些图像块的比其他图像块大一点或者小一点的情况引起程序出错print(img[gy[i][j]:gy[i+1][j+1], gx[i][j]:gx[i+1][j+1],:])divide_image[i,j,0:gy[i+1][j+1]-gy[i][j], 0:gx[i+1][j+1]-gx[i][j],:]= img[gy[i][j]:gy[i+1][j+1], gx[i][j]:gx[i+1][j+1],:]return divide_imagedef divide_method2(img,m,n):#分割成m行n列h, w = img.shape[0],img.shape[1]grid_h=int(h*1.0/(m-1)+0.5)#每个网格的高grid_w=int(w*1.0/(n-1)+0.5)#每个网格的宽#满足整除关系时的高、宽h=grid_h*(m-1)w=grid_w*(n-1)#图像缩放img_re=cv2.resize(img,(w,h),cv2.INTER_LINEAR)# 也可以用img_re=skimage.transform.resize(img, (h,w)).astype(np.uint8)#plt.imshow(img_re)gx, gy = np.meshgrid(np.linspace(0, w, n),np.linspace(0, h, m))gx=gx.astype(np.int_)gy=gy.astype(np.int_)divide_image = np.zeros([m-1, n-1, grid_h, grid_w,3], np.uint8)#这是一个五维的张量,前面两维表示分块后图像的位置(第m行,第n列),后面三维表示每个分块后的图像信息for i in range(m-1):for j in range(n-1):divide_image[i,j,...]=img_re[gy[i][j]:gy[i+1][j+1], gx[i][j]:gx[i+1][j+1],:]return divide_imagedef save_blocks(title,divide_image):#m,n=divide_image.shape[0],divide_image.shape[1]for i in range(m):for j in range(n):plt.imshow(divide_image[i,j,:])plt.axis('off')plotPath= str(title)+"+"+str(i)+str(j)+'.jpg' # 图片保存路径plt.savefig("./img_list/"+plotPath)if __name__ == '__main__':intput = read_directory("./img_total")print("图片共有:",len(intput))title = 1print("==============开始分块处理文件夹内的图片==============")for input_path in intput:print("开始处理第",title,"个,其地址为:",input_path)img = cv2.imread(input_path) # 图片地址img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)h, w = img.shape[0], img.shape[1]m = 4n = 4divide_image2=divide_method2(img,m+1,n+1)   #该函数中m+1和n+1表示网格点个数,m和n分别表示分块的块数save_blocks(title,divide_image2)print("第", title, "个已分块完毕")print("-----------------------------")title += 1print("==============完成全部分块处理文件夹的图片==============")

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

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

相关文章

17.3.12---urlparse模块的URL下载

1---urlparse模块是一个解析与泛解析Web网址URL字符串的一个工具 urlparse模块会将一个普通的url解析为6个部分,返回的数据类型都是元祖,同时,他还可以将已经分解后的url在组合成url地址 返回六个部分,分别是:scheme&a…

C语言变量和函数命名规范

C 语言变量和函数命名规范: 关于C语言变量和函数命名规范 据考察,没有一种命名规则可以让所有的程序员赞同,程序设计教科书一般都不指定命名规则。命名规则对软件产品而言并不是“成败悠关”的事,我们不要化太多 精力试图发明世界上最好的命据…

python爬虫用什么软件写_python爬虫怎么写

如今很多有编程能力的小伙伴已经不满足手动搜索内容了,都希望通过编写爬虫软件来快速获取需要的内容,那么如何使用python制作爬虫呢?下面小编给大家讲解一下思路 工具/原料 python 方法/步骤 1 首先我们需要确定要爬取的目标页面内容&#xf…

花书《深度学习》代码实现:01 线性代数:基本概念+代码实现基本运算

1 标量、向量、矩阵和张量 2 矩阵和向量相乘 3 单位矩阵和逆矩阵 3.0 单位矩阵 a np.identity(3) # 三行三列单位矩阵 3.1 矩阵的逆 A [[1.0,2.0],[3.0,4.0]] A_inv np.linalg.inv(A) print("A 的逆矩阵", A_inv) 3.1 转置 A np.array([[1.0,2.0],[1.0,0…

【Pytorch神经网络理论篇】 38 Transformers:安装说明+应用结构+AutoModel类

同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)目录地址…

python微信自动发消息_如何利用python3实现微信定时自动发消息和图片?

python代码: import itchat import time itchat.auto_login(hotReloadTrue) AutoList ["",""]#需要发送消息的好友,可以不止一个 message ""#需要发送的消息 path ""#需要发送图片的位置 while True: time_now time.st…

C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它...

C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 using System; using System.Collections.Generic; using System.ComponentModel;…

AttributeError: module ‘torch.utils‘ has no attribute ‘data‘

一、解决问题 AttributeError: module torch.utils has no attribute data 二、解决思路 属性错误:模块的torch.utils没有属性data 三、解决方法 只需在顶行添加此代码即可! import torch.utils.data # 新添加代码

nordic 协议栈区别

S110 指的是从设备的协议栈 S120 指的是主设备的协议栈 S130 SoftDevice是符合蓝牙4.1规范的协议堆栈,包含了所有蓝牙智能协议层直至包含GATT/GAP。它支持多链路中心、周边、观察器和播送器任务、GATT服务器和客户机,以及由事件驱动、异步和线程安全的G…

clone是深拷贝还是浅拷贝_Python中的浅拷贝和深拷贝

本文翻译自copy in Python (Deep Copy and Shallow Copy),讲述了在Python语言中浅拷贝与深拷贝的不同用法。全文系作者原创,仅供学习参考使用,转载授权请私信联系,否则将视为侵权行为。码字不易,感谢支持。以下为全文内…

在mybatis中resultMap与resultType的区别

MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMapresultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用但是resultType跟resultMap不能同时存在。在MyBatis进行查询映射的时候,其实查询出来…

【Pytorch神经网络实战案例】32 使用Transformers库的管道方式实现:加载指定模型+文本分类+掩码语言建模+摘要生成+特征提取+阅读理解+实体词识别

管道方式是Transformers库中高度集成的极简使用方式。使用这种方式来处理NLP任务,只需要编写几行代码就能实现。通过本例的练习可以使读者对Transformers库的使用快速上手。 1 在管道方式中指定NLP任务 Transfomers库的管道方式使用起来非常简单,核心步…

QT创建文件夹

最近在做项目的时候,需要创建一个新的文件夹保存临时文件,但是很长时间都没有解决这个问题,今天终于解决了,拿出来和网友分享一下Qt中创建文件夹的方法。如下代码是在单击按钮后,先判断文件夹是否存在,若不…

jqprint获取打印页数_如何将每张打印多页PPT的PDF变成常规课件

在工作和学习中,经常会收到各种 PDF 文件,尤其是老师的课件。为了防止学生大量上传到各种文库网站赚积分,或者为了方便学生打印出来预习复习。通常,会在每页 PDF 里面,打印多张 PPT 内容。一般是 6 张或 9 张&#xff…

Pycharm报错:Process finished with exit code -1066598274 (0xC06D007E)

【问题描述】pycharm运行到np.linalg.slogdet()时报错Process finished with exit code -1066598274 (0xC06D007E),检查发现该函数输入shape就会报错 【解决方法】将python3.8换成python3.6,问题解决!(还是老老实实用3.6吧 -- &am…

rtt 打印 float

/*rtt print float*/float float_value;float_value 3.1415;char float_str[80];sprintf(float_str, "Float value is %f\n", float_value); NRF_LOG_PRINTF(float_str);

Hibernate学习笔记③

数据库关系 多对多:通过第三张表来建立关系 第三张表至少包含两个字段作为外键且字段是其他两张表的主键 Hibernate一对多的操作 (1)一对多映射配置 步骤: 首先创建两个存在一对多关系的实体类两个实体类需要建立一对多的关系:在多…

vba 判断文本框内容是否为空_【VBA】 数据输入 Inputbox 基本语法

在使用Excel 的过程中,如果需要用户输入简单的数据,作为“已知数”,那么可以使用inputbox 函数显示一个对话框,供用户在对话框中输入数据。 Inputbox 函数语法在一对话框来中显示提示,等待用户输入正文或按下按钮&…

AttributeError: ‘version_info‘ object has no attribute ‘version‘

AttributeError: ‘version_info‘ object has no attribute ‘version‘ 解决方法为:pip install pyparsing2.4.7

Qt删除 空格/空白符

QString str " ad dfdsf ef okkd ikk"; str.remove(QRegExp("\\s")); qDebug()<<str.remove(QRegExp("\\s")); "addfdsfefokkdikk"还有去掉前后的空白符 Example: QString str " lots\t of\nwhitespace\r\n "; …