利用cv2的findContours 把黑白图片上的文字部分裁剪下来保存

2023-11-06 07:00

本文主要是介绍利用cv2的findContours 把黑白图片上的文字部分裁剪下来保存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

findContours对于二值化图片的物体找轮廓真的挺好用的。

项目所需,效果如下:

 

每个模块有用的部分都在注释里了,希望小白的自己以后有用的话,能找得到。

import cv2
import numpy as np
import os
import shutil##获得一张图片的文字框信息,左上角和右下角 并写入文件中
def get_condition(img,path,title):#img 图片 path :txt文件的路径+名字 title:这一行的标注名gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)binary = 255-binarycontours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# x0,y0 左上角 x1,y1右下角 chushihuax0,y0,x1,y1 = 255,255,0,0for c in contours:##不断比较,得到框的边界x, y, w, h = cv2.boundingRect(c)x0 = min(x,x0)y0 = min(y,y0)x1 = max(x1,x+w)y1 = max(y1,y+h)##enlarge box 把框搞的大一丢丢x0=int(x0-5)y0=int(y0-5)x1=int(x1+5)y1=int(y1+5)# draw box#h=cv2.rectangle(img, (x0,y0),(x1,y1), (0, 0, 255), 2)#cv2.imshow('h',h)#cv2.waitKey(10000)condition = title+' ' +str(x0)+' '+str(y0)+ ' '+str(x1)+" "+str(y1)+" "+"\n"#print(condition)with open(path, 'a') as f:  # 'a'表示append,即在原来文件内容后继续写数据(不清楚原有数据)f.write(condition)f.close()#根据文件和坐标,将图片进行裁剪,保存
def cut_img(img,condition,save_path):#防止有些左上角越界if condition[0]<0:condition[0]=0if condition[1]<0:condition[1]=0crop = img[condition[1]:condition[3],condition[0]:condition[2]]  #y0:y1, x0:x1print(condition)cv2.imwrite(save_path,crop)#读取txt文件的每一行,并对每一行用空格进行分开,再根据每一行,对图片进行裁剪,保存到对应字母的文件夹下
def read_image(img_path,img_path_new,txt_path):aa = []with open(txt_path, "r") as f:for line in f.readlines():data = line.split('\n\t')for str in data:sub_str = str.split(' ')if sub_str:aa.append(sub_str)#print(aa)for j in range(9500): #txt文件中的数据行数condition=[]for i in range(4):condition.append(int(aa[j][i+1]))#save_path='/home/cpy/PycharmProjects/SingleGAN-master/image_new/'+'a'+'/'+'a1'+'.jpg'img = cv2.imread(img_path+aa[j][0]+'.jpg')cut_img(img,condition,save_path = img_path_new+aa[j][0][0]+'/'+aa[j][0]+'.jpg')#新建 a-z文件夹
def file():for i in range(25):os.mkdir('./image_new/'+chr(97+i))#对文件夹中包含‘0to1’的文件进行改名,把文字位置保存下来,把不包含0to1的文件删除#注意 os.listdir()返回的文件名不一定是顺序的,可能是随机的
def process_img(img_path,txt_path):for i in os.listdir(img_path):if '0to1' in i:img = cv2.imread(img_path+i)get_condition(img,txt_path,i[0:-13])os.rename(img_path+i,img_path+i[0:-13]+'.jpg')else:os.remove(img_path+i)img_path = '/home/cpy/PycharmProjects/SingleGAN-master/images/'
txt_path = './condition.txt'
img_path_new = '/home/cpy/PycharmProjects/SingleGAN-master/image_new/'
#process_img(img_path,txt_path)
read_image(img_path,img_path_new,txt_path)

 

这篇关于利用cv2的findContours 把黑白图片上的文字部分裁剪下来保存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/355141

相关文章

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

项目实战系列三: 家居购项目 第四部分

购物车 🌳购物车🍆显示购物车🍆更改商品数量🍆清空购物车&&删除商品 🌳生成订单 🌳购物车 需求分析 1.会员登陆后, 可以添加家居到购物车 2.完成购物车的设计和实现 3.每添加一个家居,购物车的数量+1, 并显示 程序框架图 1.新建src/com/zzw/furns/entity/CartItem.java, CartItem-家居项模型 /***

码蹄集部分题目(2024OJ赛9.4-9.8;线段树+树状数组)

1🐋🐋配对最小值(王者;树状数组) 时间限制:1秒 占用内存:64M 🐟题目思路 MT3065 配对最小值_哔哩哔哩_bilibili 🐟代码 #include<bits/stdc++.h> using namespace std;const int N=1e5+7;int a[N],b[N],c[N],n,q;struct QUERY{int l,r,id;}que

下载/保存/读取 文件,并转成流输出

最近对文件的操作又熟悉了下;现在记载下来:学习在于 坚持!!!不以细小而不为。 实现的是:文件的下载、文件的保存到SD卡、文件的读取输出String 类型、最后是文件转换成流输出;一整套够用了; 重点: 1:   操作网络要记得开线程; 2:更新网络获取的数据 切记用Handler机制; 3:注意代码的可读性(这里面只是保存到SD卡,在项目中切记要对SD卡的有无做判断,然后再获取路径!)

FFmpeg系列-视频解码后保存帧图片为ppm

在正常开发中遇到花屏时怎么处理呢?可以把解码后的数据直接保存成帧图片保存起来,然后直接看图片有没有花屏来排除是否是显示的问题,如果花屏,则代表显示无问题,如果图片中没有花屏,则可以往显示的方向去排查了。 void saveFrame(AVFrame* pFrame, int width, int height, int iFrame){FILE *pFile;char szFilename[

关于断言的部分用法

1、带变量的断言  systemVerilog assertion 中variable delay的使用,##[variable],带变量的延时(可变延时)_assertion中的延时-CSDN博客 2、until 的使用 systemVerilog assertion 中until的使用_verilog until-CSDN博客 3、throughout的使用   常用于断言和假设中的

通用内存快照裁剪压缩库Tailor介绍及源码分析(一)

背景 我们知道内存快照是治理 OOM 问题及其他类型的内存问题的重要数据源,内存快照中保存了进程虚拟机的完整的堆内存数据,很多时候也是调查其他类型异常的重要参考。但是dump出来的堆转储文件.hprof往往很大,以 LargeHeap 应用为例,其 OOM 时的内存快照大小通常在512M左右,要有效的存储和获取都是一个问题。 线下拿到hprof文件相对容易,也可以预防OOM,但覆盖的场景十分有

Windows11电脑上自带的画图软件修改照片大小(不裁剪尺寸的情况下)

针对一张图片,有时候上传的图片有大小限制,那么在这种情况下如何修改其大小呢,在不裁剪尺寸的情况下 步骤如下: 1.选定一张图片,右击->打开方式->画图,如下: 第二步:打开图片后,我们可以看到图片的大小为82.1kb,点击上面工具栏的“重设大小和倾斜”进行调整,如下: 第三步:修改水平和垂直的数字,此处我修改为分别都修改为50,然后保存,可以看到大小变成63.5kb,如下: