Opencv将图片中的手写数字一个一个单独的抠出来并保存到指定的文件夹

2023-05-16

今天想要构建自己的MNIST数据集,但是一个一个手画然后拍照再把数字一个一个抠出来实在是太耗时了,所以想用程序解决这个问题:

下面附上程序:(备注:里面的代码是在之前某个博主的代码基础上改装过来的,具体是哪个我已经不记得了)

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt


# 反相灰度图,将黑白阈值颠倒
def accessPiexl(img):
    height = img.shape[0]
    width = img.shape[1]
    for i in range(height):
       for j in range(width):
           img[i][j] = 255 - img[i][j]
    return img

# 反相二值化图像
def accessBinary(img, threshold=200):
    img = accessPiexl(img)
    # 边缘膨胀,不加也可以
    kernel = np.ones((3, 3), np.uint8)
    img = cv2.dilate(img, kernel, iterations=1)
    _, img = cv2.threshold(img, threshold, 0, cv2.THRESH_TOZERO)

    return img

# 寻找边缘,返回边框的左上角和右下角(利用cv2.findContours)
def findBorderContours(path, maxArea=50):
    img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)#(cv2.IMREAD_GRAYSCALE)按灰度模式读取图像
    img = accessBinary(img)
    contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)#(cv2.RETR_EXTERNAL)检测边缘,(cv2.CHAIN_APPROX_NONE)绘制
    borders = []
    border_sortt = []
    # print("打印",hierarchy)
    for contour in contours:
        # 将边缘拟合成一个边框
        x, y, w, h = cv2.boundingRect(contour)
        if w*h > maxArea:
            border = [(x, y), (x+w, y+h)]
            borders.append(border)

    return borders

# 显示结果及边框
def Save_Results(path, borders):
    img = cv2.imread(path)
    # 绘制
    print(img.shape)
    for i, border in enumerate(borders):

        print("border = ",border)
        pic = img[border[0][1] - 30 :border[1][1] + 30 , border[0][0] - 30 : border[1][0] + 30]
        # cv2.imshow("img",pic)
        # cv2.waitKey(0)

        cv2.imwrite("D:/0000{num}.jpg".format(num=i),pic)


if __name__ == '__main__':
    # 综合测试
    path = './1.jpg'
    borders = findBorderContours(path) #要抠图的原图片
    Aave_Results(path, borders)

显示效果:

原图:
在这里插入图片描述
处理后的:

在这里插入图片描述
在这里插入图片描述

处理的结果勉勉强强,勿喷

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Opencv将图片中的手写数字一个一个单独的抠出来并保存到指定的文件夹 的相关文章

  • cocos2dx 第七课 动作和动画

    一 动作的行为 runAction Action act 运行动作 stopAction Action act 停止动作 stopActionByTag int tag 停止动作 stopAllActions 停止节点所有动作 二 动作的种
  • 线性最小方差估计理论推导

    线性最小方差估计理论推导 定义 也叫线性最小均方误差估计 xff0c 顾名思义 xff0c 就是使估计误差的平方和的均值达到最小 理论推导 假设系统 z 61 H x 43
  • D435i、D435、D415、T265的Realsense_viewer环境搭配及安装

    安装步骤 1 注册服务器公钥 sudo apt span class token operator span key adv span class token operator span keyserver keys span class
  • VS Code下利用Cmake开发C++-单文件

    单文件 xff1a 第一步 xff1a 创建CmakeLists txt文件 第二步 xff1a 编写CmakeLists 设置最小版本 span class token function cmake minimum required sp
  • ECharts学习--主题设置

    xff08 1 xff09 内置主题 echarts中默认主题有两个 light dark 在初始化对象方法中 xff0c init可以指明 xff1a xff08 1 xff09 dark var mCharts 61 echarts i
  • 隔壁老王看了都会的文章:STM32串口实验——单片机与上位机交互信息

    今天介绍USART串口通信的使用 xff0c 目的在于会用串口传送和接收数据 内容包含了NVIC中断的知识 xff0c 下一篇着重讲NVIC中断 ADC在下下一篇 主要还是先看懂USART的相关代码 什么是串行通信 我们对通信的字面意思理解
  • C++ 字符串(string)常用操作总结

    目录 0 常用功能汇总 1 定义一个字符串 2 读写 string 操作 3 查询字符串信息 索引 4 拼接 比较等操作 5 cctype 头文件 判断字符类型 xff1a 大 小写字母 标点 数字等 6 for 循环遍历 7 修改 str
  • USB学习笔记——USB通信过程与枚举过程

    在网上看到一篇文章就是讲这个的 xff0c 仔细阅读后获得了很多感触 xff0c 整理总结如下 一 USB接口 在USB的集线器端D xff0c D 43 都接了下拉电阻 xff0c 而USB设备端的D xff0c D 43 接了上拉电阻
  • BGP协议的难点笔记和重要性

    bgp的报文 有五种报文类型bgp的包头长什么样 xff1a 由market 标记 length 长度 type 报文类型 这3个东西组成open报文 xff1a 用来维护bgp的建立 xff0c 就是bgp对等体之间的信息建立update
  • 使用xfsdump及xfsrestore备份并恢复文件

    xfs提供了xfsdump和xfsrestore工具 xff0c 协助备份xfs文件系统中的数据 xfsdump按inode顺序备份一个xfs文件系统8 xfs备份级别有2种 xff1a 0表示完全备份 xff0c 1 9表示增量备份 xf
  • 电赛准备过程记录

    电赛记录 xff08 1 xff09 2021全国大学生电子设计大赛参赛纪实 xff08 无人机赛题 xff09 提示 xff1a 写完文章后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 电赛记录 xf
  • Jetson TX2新手上路全记录(1)

    Jetson TX2小白零基础上手记录 xff08 1 xff09 暑假申请了一块TX2进行学习 xff0c 从头开始记录学习过程 趁着在装虚拟机先唠两句 文章目录 Jetson TX2小白零基础上手记录 xff08 1 xff09 开箱环
  • Jetson TX2新手上路全记录(3)

    ng 3 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 例如 xff1a 第一章 Python 机器学习入门之pandas的使用 提示 xff1a 写完文章后 xff0c 目录可以自动生成 xff
  • 傅里叶变换详解

    一 用途 xff1a 任意 的函数经过一定的分解 xff0c 都能够表示为正弦函数的线性组合形式 比如想要过滤一首音乐中的噪音 xff0c 我们可以使用傅里叶变换将叠加后的图像分离为一个个纯声的正弦图像 xff0c 去掉特定频率的噪声就能实
  • git如何删除本地所有未提交的更改

    在使用git的时候 xff0c 如果本地做的修改都不想保留了 xff0c 可以通过下面命令恢复成HEAD版本 xff0c 未提交的以及加入暂存区中的修改都会被舍弃 git reset hard git clean xdf 转自
  • ESP32的RMT模块项目实用

    1 技术背景 最近公司在用ESP32的模组方案实现智能音箱的相关功能的项目 需要展示模组的网络状态以及音箱的语音交互状态 xff0c 找了一家RGB灯板供应商 需要模组通过一个io口输出脉冲波形 xff0c 来控制灯板切换模式 xff0c
  • ESP32 LOG库使用

    ESP32 log库 官方文档 一 printf是不可重入函数 printf不能在中断中被调用的原因是它是一个不可重入函数 xff0c 而在中断中要避免调用不可重入函数 xff0c 首先我们先说说什么是不可重入函数 简单说来 xff0c 区
  • C++ 数组(vector)常用操作总结

    目录 1 vector对象的定义和初始化方式 2 vector 常用基础操作 3 使用迭代器的遍历 插入 删除操作 4 vector 元素的重排操作 xff08 排序 逆序等 xff09 5 vector 中找最值 6 改变vector大小
  • 小熊派开发板移植RT-FOTA

    前言 买了小熊派的开发板 xff0c 将demo code验证完成之后就放下了 刚好最近工作也在做OTA相关的开发 xff0c 发现自己对于升级的功能还不够了解 xff0c 在码云找到了一位大神基于RTThread的RT FOTA代码 xf
  • 小熊派移植RT-Thread 的app代码

    前言 在上一篇我们已经讲解了如何移植RT FOTA到小熊派开发板 本篇我们将继续移植RT Thread xff0c 实现app代码的移植开发 xff0c 并将BootLoader和app一起烧录到开发板 xff0c 完成BootLoader

随机推荐