使用OpenCV将图片切割成小图 及图片拼接(附python代码)

news2024/9/22 9:29:59

文章目录

  • 1. 图片切割
  • 2. 图片拼接
  • 3. Acknowledgment
  • Reference

要分割的图片如下:

在这里插入图片描述

1. 图片切割

思路也比较简单,代码注释比较详细,看代码就行。

from cv2 import cv2
import numpy as np
import os
 
pic_path = '.jpg' # 分割的图片的位置
pic_target = './result/' # 分割后的图片保存的文件夹
if not os.path.exists(pic_target):  #判断是否存在文件夹如果不存在则创建为文件夹
    os.makedirs(pic_target)
#要分割后的尺寸
cut_width = 512
cut_length = 512
# 读取要分割的图片,以及其尺寸等数据
picture = cv2.imread(pic_path)
(width, length, depth) = picture.shape
# 预处理生成0矩阵
pic = np.zeros((cut_width, cut_length, depth))
# 计算可以划分的横纵的个数
num_width = int(width / cut_width)
num_length = int(length / cut_length)
# for循环迭代生成
for i in range(0, num_width):
    for j in range(0, num_length):
        pic = picture[i*cut_width : (i+1)*cut_width, j*cut_length : (j+1)*cut_length, :]      
        result_path = pic_target + '{}_{}.jpg'.format(i+1, j+1)
        cv2.imwrite(result_path, pic)
 
print("done!!!")

效果如下:

在这里插入图片描述

2. 图片拼接

有了分割好的图片之后,后面可能还要进行拼接,拼接相对复杂一些。

from cv2 import cv2
import numpy as np
import os
# 分割后的图片的文件夹,以及拼接后要保存的文件夹
pic_path = '/result/'
pic_target = 'picture/'
# 数组保存分割后图片的列数和行数,注意分割后图片的格式为x_x.jpg,x从1开始
num_width_list = []
num_lenght_list = []
# 读取文件夹下所有图片的名称
picture_names =  os.listdir(pic_path)
if len(picture_names)==0:
    print("没有文件")
 
else:
    # 获取分割后图片的尺寸
    img_1_1 = cv2.imread(pic_path + '1_1.jpg')
    (width, length, depth) = img_1_1.shape
    # 分割名字获得行数和列数,通过数组保存分割后图片的列数和行数
    for picture_name in picture_names:
        num_width_list.append(int(picture_name.split("_")[0]))
        num_lenght_list.append(int((picture_name.split("_")[-1]).split(".")[0]))
    # 取其中的最大值
    num_width = max(num_width_list)
    num_length = max(num_lenght_list)
    # 预生成拼接后的图片
    splicing_pic = np.zeros((num_width*width, num_length*length, depth))
    # 循环复制
    for i in range(1, num_width+1):
        for j in range(1, num_length+1):
            img_part = cv2.imread(pic_path + '{}_{}.jpg'.format(i, j))
            splicing_pic[width*(i-1) : width*i, length*(j-1) : length*j, :] = img_part
    # 保存图片,大功告成
    cv2.imwrite(pic_target + 'result.jpg', splicing_pic)
    print("done!!!")

拼接后的效果图如下:

在这里插入图片描述

注意:分割和代码采用文中的分割代码,拼接才能成功,或者保持相同的命名方式。

3. Acknowledgment

感谢作者的好友 HNU_刘yuan 对本文的帮助

Reference

https://blog.csdn.net/qq_40608730/article/details/109190493

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

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

相关文章

【嵌入式——QT】QWT应用

【嵌入式——QT】QWT应用 概述步骤一步骤二步骤三代码声明代码实现图示 概述 QWT,全称Qt Widgets for Technical Applications,是一个基于Qt开发的第三方库。它主要为具有技术背景的程序提供GUI组件和一组实用类,用于生成各种统计图。QWT的主…

【CPP】C++11多线程

thread类 在C11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C11中最重要的特性就是对线程进行支持了,使得C在并行编程时不需要依赖第三方库&#xff0c…

深度学习500问——Chapter04:经典网络解读(1)

文章目录 4.1 LeNet-5 4.1.1 模型介绍 4.1.2 模型结构 4.1.3 模型特性 4.2 AlexNet 4.2.1 模型介绍 4.2.2 模型结构 4.2.3 模型特性 4.3 ZFNet 4.3.1 模型介绍 4.3.2 模型结构 4.3.3 模型特性 4.4 Network in Network 4.4.1 模型介绍 4.4.2 模型结构 4.4.3 模型特性 4.1 LeNet-…

60、服务攻防——中间件安全CVE复现weblogicJenkinsGlassFish

文章目录 weblogicJbossJenkinsGlassFish weblogic 默认端口:7001,历史漏洞:CVE_2017_3506、CVE_2018_2893、CVE_2018_3245、CVE_2020_14882、CVE_2021_2394 Jboss 历史漏洞:CVE-2017-12149、CVE-2017-7504 Jenkins GlassFis…

安卓 Android Activity 生命周期

文章目录 Intro生命周期方法 & 执行顺序结论code Intro 本文提供一个测试类通过打印的方式展示在多个Activity之间互相跳转的时候,各个Activity的生命周期相关方法的执行顺序。 生命周期方法 & 执行顺序结论 下图出自 郭霖 《第一行代码(第二…

深度学习pytorch——激活函数损失函数(持续更新)

论生物神经元与神经网络中的神经元联系——为什么使用激活函数? 我们将生物体中的神经元与神经网络中的神经元共同分析。从下图可以看出神经网络中的神经元与生物体中的神经元有很多相似之处,由于只有刺激达到一定的程度人体才可以感受到刺激&#xff0c…

微服务高级篇(三):分布式缓存+Redis集群

文章目录 一、单点Redis的问题及解决方案二、Redis持久化2.1 单机安装Redis2.2 RDB持久化2.3 AOF持久化2.4 RDB和AOF对比 三、Redis主从3.1 搭建Redis主从架构3.1.1 集群结构3.1.2 准备实例和配置3.1.3 启动3.1.4 开启主从关系3.1.5 测试 3.2 数据同步3.2.1 全量同步【建立连接…

Windows11企业版安装WSL2和Ubuntu发布版(避坑)

背景 win10企业版升级win11企业版后,安装WSL2,最后安装WSL的Ubuntu发布版,尝试网上各种方法,还是出现文章第三节所写的问题,差点被这问题搞放弃了,全网少有针对这个问题的答案,有也不顶用&…

python-pandas基础学习

可参考: pandas:http://pandas.pydata.org/docs/user_guide/10min.html 一、基础知识 DataFrame 方法,可以将一组数据(ndarray、series, map, list, dict 等类型)转化为表格型数据 import pandas as pd data {name: …

Python代码规范化

什么是代码规范化? 代码的规范化书写是指按照一定的规范和标准编写代码,使得代码结构清晰、易于阅读和理解。 代码规范化的意义 Python代码规范化的意义在于提高代码可读性、可维护性和可重用性,从而使代码更易于理解、调试和协作&#xff0c…

解锁AI生成模型的无限可能:Stability-AI 带你领略前沿科技

厌倦了千篇一律的图片和视频?想要创作独一无二的艺术作品?Stability-AI 横空出世,为你打开通往 AI 生成模型的大门,带你领略前沿科技的无限可能! 神奇的功能,尽在掌握 Stability-AI 拥有众多令人惊叹的功能…

AI基础知识(4)--贝叶斯分类器

1.什么是贝叶斯判定准则(Bayes decision rule)?什么是贝叶斯最优分类器(Bayes optimal classifier)? 贝叶斯判定准则:为最小化总体风险,只需在每个样本上选择那个能使条件风险最小的…

js - 练习题

文章目录 FED3:查找两个节点的最近的一个共同父节点FED4:根据包名,在指定空间中创建对象FED5: 数组去重FED6:用 JavaScript 实现斐波那契数列函数,返回第n个斐波那契数。 f(1) 1, f(2) 1 等FED12:字符串统计FED17&am…

联想ThinkSystem服务器主要硬件Windows Server驱动下载说明

故障现象: 不知道如何获取ThinkSystem系列服务器在Windows Server操作系统下的驱动程序? 解决方案: 本文提供ThinkSystem系列服务器安装Windows Server操作系统所需要的驱动程序下载说明。 以下多路机型的Windows Server 2012 R2及2016驱动…

Linux基础命令[20]-useradd

文章目录 1. useradd 命令说明2. useradd 命令语法3. useradd 命令示例3.1 不加参数3.2 -d(指定家目录)3.3 -g(指定用户组)3.4 -G(指定附属组)3.5 -p(加密密码)3.6 -e(指…

【JDBC编程】Java连接MySQL的五个步骤

目录 JDBC编程 1.JDBC的使用 2.数据库连接Connection 3.Statement对象 4.ResultSet对象 JDBC编程 JDBC编程运用了MySQL提供的 Java 的驱动包 mysql-connector-java ,需要基于 Java 操作 MySQL 即需要该驱动包。同样的, 要基于 Java 操作 Oracle 数据库…

XML Data – Semi-Structured Data XML 数据 - 半结构化数据

Outline • Structured, Semistructured, and Unstructured Data • XML Hierarchical (Tree) Data Model • Extracting XML Documents from Relational Databases • XML Documents, DTD, and XML Schema • XML Languages 结构化、半结构化和非结构化数据 - XML 层次&#x…

Java最后一块石头的重量 II(力扣Leetcod1049)

最后一块石头的重量 II 力扣原题 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结…

Java学习笔记NO.24

T1.完成理工超市系统的商品类及其子类的定义&#xff0c;实现“浏览商品”及“查看商品详情”功能 &#xff08;1&#xff09;商品类 public class Goods {public String name;public double price;public int count;public String desc;public Goods(String name, double p…

C/C++代码性能优化——编程实践

1. 编程实践 在一些关键的地方&#xff0c;相应的编程技巧能够给性能带来重大提升。 1.1. 参数传递 传递非基本类型时&#xff0c;使用引用或指针&#xff0c;这样可以避免传递过程中发生拷贝。参数根据是否需要返回&#xff0c;相应加上const修饰&#xff0c;代码更安全&am…