opencv图像裁剪与拼接

舍弃不够整除的部分,对大尺寸的图像裁剪成m行n列的小图,将小图相对大图的行列位置存储在图像名中

之后对小图进行目标检测标注目标位置

再将小图依次拼接,铺成大图

 1 # coding=utf-8
 2 from PIL import Image
 3 # pil paste可以进行图片拼接
 4 import cv2
 5 import numpy as np
 6 import glob as glob
 7 import os
 8 """
 9 输入:图片路径(path+filename),裁剪获得小图片的列数、行数(也即宽、高)
10 输出:无
11 """
12 def crop_one_picture(path, filename, cols, rows):
13     img = cv2.imread(filename,1)  ##读取彩色图像,图像的透明度(alpha通道)被忽略,默认参数;灰度图像;读取原始图像,包括alpha通道;可以用1,0,-1来表示
14     sum_rows = img.shape[0]  # 高度
15     sum_cols = img.shape[1]  # 宽度
16     save_path = path + "\\crop{0}_{1}\\".format(cols, rows)  # 保存的路径
17     if not os.path.exists(save_path):
18         os.makedirs(save_path)
19     print("裁剪所得{0}列图片,{1}行图片.".format(int(sum_cols / cols), int(sum_rows / rows)))
20
21     for i in range(int(sum_cols / cols)):
22         for j in range(int(sum_rows / rows)):
23             print(save_path+str(os.path.splitext(filename)[0].split("\\")[-1]) + ‘_‘ + str(j) + ‘_‘ + str(i) + ‘.jpg‘)
24             cv2.imwrite(
25                 save_path + str(os.path.splitext(filename)[0].split("\\")[-1]) + ‘_‘ + str(j) + ‘_‘ + str(i) + ‘.jpg‘, img[j * rows:(j + 1) * rows, i * cols:(i + 1) * cols, :])
26             #cv2.imwrite(‘.//origin-img//{0}_{1}.jpg‘.format(i,j), img[j * rows:(j + 1) * rows, i * cols:(i + 1) * cols])
27     print("裁剪完成,得到{0}张图片.".format(int(sum_cols / cols) * int(sum_rows / rows)))
28     print("文件保存在{0}".format(save_path))
29
30
31 """遍历文件夹下某格式图片"""
32 def file_name(root_path,picturetype):
33     filename=[]
34     for root,dirs,files in os.walk(root_path):
35         for file in files:
36             if os.path.splitext(file)[1]==picturetype:
37                 filename.append(os.path.join(root,file))
38     return filename
39
40 root_path=‘.\\origin-img\\‘
41 filenamelist=file_name(root_path,‘.jpg‘)
42
43 print(filenamelist)
44 each_name_list=[]
45 for each_name in filenamelist:
46     each_name_list.append(each_name.split("\\")[-1])
47 print(each_name_list)  # final name
48 w=500
49 h=500
50 for each_img in each_name_list:
51     crop_one_picture(root_path,each_name,w,h)

合并图像:

 1 # coding=utf-8
 2 from PIL import Image
 3 # pil paste可以进行图片拼接
 4 import cv2
 5 import numpy as np
 6 import glob as glob
 7 import os
 8
 9 """
10
11 输入:图片路径(path+filename),裁剪所的图片的列的数量、行的数量
12 输出:无
13 """
14 def merge_picture(merge_path):
15     filename=file_name(merge_path,".jpg")
16     shape=cv2.imread(filename[0],1).shape    #三通道的影像需把-1改成1
17     cols=shape[1]
18     rows=shape[0]
19     channels=shape[2]
20
21
22     max_cols_th = 0
23     max_rows_th = 0
24     for i in range(len(filename)):
25         img=cv2.imread(filename[i],1)
26         cols_th=int(filename[i].split("_")[-1].split(‘.‘)[0])
27         if cols_th>max_cols_th:
28             max_cols_th=cols_th
29         rows_th=int(filename[i].split("_")[-2])
30         if rows_th>max_rows_th:
31             max_rows_th=rows_th
32     print(max_rows_th,max_cols_th)
33     num_of_cols=max_cols_th+1
34     num_of_rows=max_rows_th+1
35
36
37     dst=np.zeros((rows*num_of_rows,cols*num_of_cols,channels),np.uint8)
38     for i in range(len(filename)):
39         img=cv2.imread(filename[i],1)
40         cols_th=int(filename[i].split("_")[-1].split(‘.‘)[0])
41         rows_th=int(filename[i].split("_")[-2])
42         print(rows_th,cols_th)
43         roi=img[0:rows,0:cols,:]
44
45         dst[rows_th*rows:(rows_th+1)*rows,cols_th*cols:(cols_th+1)*cols,:]=roi
46     cv2.imwrite(merge_path+"merge.jpg",dst)
47
48 """遍历文件夹下某格式图片"""
49 def file_name(root_path,picturetype):
50     filename=[]
51     for root,dirs,files in os.walk(root_path):
52         for file in files:
53             if os.path.splitext(file)[1]==picturetype:
54                 filename.append(os.path.join(root,file))
55     return filename
56
57
58
59 merge_path=".\\origin-img\\crop500_500\\"   #要合并的小图片所在的文件夹
60
61 merge_picture(merge_path)

原文地址:https://www.cnblogs.com/wind-chaser/p/12093767.html

时间: 2024-11-01 17:12:59

opencv图像裁剪与拼接的相关文章

OpenCV —— 图像局部与部分分割(一)

背景减除 一旦背景模型建立,将背景模型和当前的图像进行比较,然后减去这些已知的背景信息,则剩下的目标物大致就是所求的前景目标了 缺点 -- 该方法基于一个不长成立的假设:所有像素点是独立的 场景建模 新的前景(物体移动的新位置) -- 旧的前景 (物体离开后留下的"空洞")-- 背景 cvInitLineIterator()  和  CV_NEXT_LINE_POINT() 对任意直线上的像素进行采样 // 从视频的一行中读出所有像素的RGB值,收集这些数值并将其分成三个文件 #inc

[blog]基于SURF特征的图像与视频拼接技术的研究和实现(一)

基于SURF特征的图像与视频拼接技术的研究和实现(一) 一直有计划研究实时图像拼接,但是直到最近拜读西电2013年张亚娟的<基于SURF特征的图像与视频拼接技术的研究和实现>,条理清晰.内容完整.实现的技术具有市场价值.因此定下决心以这篇论文为基础脉络,结合实际情况,进行“基于SURF特征的图像与视频拼接技术的研究和实现”. 一.基于opencv的surf实现 3.0以后,surf被分到了"opencv_contrib-master"中去,操作起来不习惯,这里仍然选择一直在

opencv图像原地(不开辟新空间)顺时旋转90度

前一阵朋友碰到这么一道题:将图像原地顺时针旋转90度,不开辟新空间.此题看似平易(题目简短),仔细研究发现着实不容易.经过一番探索后,终于找到了正确的算法,但是当使用opencv实现时,有碰到了困难而且费了一番周折才找到问题所在. 首先,解决这个问题,先简化成原地90度旋转一M×N的矩阵A(注意不是N×N方阵).对于2×3的矩阵A = {1,2,3;4,5,6},其目标为矩阵B = {4,1;5,2;6,3}.因为是原地旋转,这里A和B应指向同一大小为6的内存空间. 这里有这样一个重要的导出公式

HTML canvas图像裁剪

canvas drawImage方法的图像裁剪理解可能会比较耗时,记录一下,以便供人翻阅! context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height); 这句话的执行过程可以这么理解: 首先是绘制一幅图像,这幅图像的宽和高就是图像实际的宽和高! 然后开始裁剪,sx   sy是裁剪的起始位置,swidth和sheight是裁剪的高度和宽度,注意限制一下最大值,不要超出图片的高度和宽度: 这样图片就裁剪好了,然后就是放到画布上.如何放置,

OpenCV &mdash;&mdash; 图像局部与分割(二)

分水岭算法 将图像中的边缘转化成"山脉",将均匀区域转化为"山谷" 分水岭算法首先计算灰度图像的梯度,这对山谷或没有纹理的盆地(亮度值低的点)的形成有效,也对山头或图像中没有主导线段的山脉(山脊对应的边缘)的形成有效.然后开始从用户指定点或算法得到的点开始"灌注"盆地知道这些区域连在一起.基于这样产生的标记就可以把区域合并到一起,合并后的区域又通过聚集的方式进行分割,好像图像被"填充"起来. cvWatershed 用 Inp

[转]OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

[OpenCV入门教程之十三]OpenCV图像金字塔:高斯金字塔.拉普拉斯金字塔与图片尺寸缩放 2014-05-18 18:58 36007人阅读 评论(54) 收藏 举报 本文章已收录于:  OpenCV知识库 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http

图像裁剪插件

最近写了个,图像裁剪的插件,在这里稍微总结一下: 前端代码(样式可以自己调): <div id="fileView" class="fileView"> <div class="imageBox hidden"> <div class="thumbBox"></div> <div class="spinner" style="display:

【OpenCV入门教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 这篇文章里,我们将一起探讨图像金字塔的一

Opencv 图像读取与保存问题

本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49737357 本文仅对 Opencv图像读取与保存进行阐述,重在探讨图像读取与保存过程中应注意的细节问题. 1 图像读取 首先看一下,imread函数的声明: // C++: Mat based Mat imread(const string& filename, int flags=1 ); // C: IplImage based