寻找图片中数字的轮廓并裁剪 扣取数字

本次数字图片来自mnist库

大体流程是:显示原图片——》灰度化(主要作用是改变数据的位数)——》进行腐蚀——》进行反二值化(使其变为白字黑背景)——》寻找轮廓——》画出轮廓——》裁剪

 为什么要灰度化呢?本来图片就是灰度的啊?原来是有如下原因:

import cv2  #导入cv库
import os

image_array = cv2.imread(‘D:/number.png‘)  #读取图片
cv2.imshow("src",image_array)   #显示原图片

# print(image_array.shape)

# print(image_array.size)

# print(image_array.dtype)

image_array=cv2.cvtColor(image_array,cv2.COLOR_BGR2GRAY)  #把图片转化为灰度图像 从cv_32转化为cv_8u

kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))  #定义腐蚀核的大小
dilated = cv2.dilate(image_array,kernel)    #进行腐蚀

cv2.imshow("Eroded Image",dilated); #显示腐蚀后的图像

ret, binary = cv2.threshold(dilated, 127, 255, cv2.THRESH_BINARY_INV)  #进行反二值化

image,contours,hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  #寻找轮廓
cv2.imshow(‘imageshow‘,image)  # **显示返回值image,其实与输入参数的thresh原图没啥区别**
# print(np.size(contours))  #
# print(contours[0])   #  打印出第一个轮廓的所有点的坐标, 更改此处的0,为0--(总轮廓数-1),可打印出相应轮廓所有点的坐标
# print(hierarchy) #**打印出相应轮廓之间的关系**

for i in range(0,len(contours)):     #画出轮廓
    x, y, w, h = cv2.boundingRect(contours[i])
    cv2.rectangle(image, (x,y), (x+w,y+h), (253,255,0), 5)

cv2.imshow("finally",image)   #显示最终效果图

newimage = image[y + 2:y + h - 2, x + 2:x + w - 2]  # 先用y确定高,再用x确定宽  #裁剪轮廓
nrootdir = ("E:/cut_image/")
if not os.path.isdir(nrootdir):
    os.makedirs(nrootdir)
cv2.imwrite(nrootdir + str(i) + ".jpg", newimage)
print(i)

cv2.waitKey(0)

显示效果:

  

原文地址:https://www.cnblogs.com/carlber/p/9822524.html

时间: 2024-11-02 23:12:40

寻找图片中数字的轮廓并裁剪 扣取数字的相关文章

寻找自适应元素(9)-透视表的数字组合

寻找自适应元素(9)-透视表的数字组合 设计要点:excle.界面.自动调整.数据透视表 阿金:"聪明"?!啊,还久没有听见你这么夸俺了. 秀秀:因为这样的组合太常用了. 阿金:还有更常用的数字组合呢. 秀秀:对对对,怎么用? 阿金:例如:"行标签"区域和"数值"区域都是"金额"字段,右击在数据透视表-"组合"对话框中,"起始于"位置输入0,"终止于"位置保持不变,步

python 识别图片中的人脸,并裁剪人脸,将图片转化成固定大小,并将图片再按照自己的后缀名存储起来

下列代码,识别图片中的人脸,并裁剪人脸,将图片转化成固定大小,再按照自己的后缀名存储起来 bug:我是用来识别单张图片中只有一个人脸的数据集,如果用来处理一张图片中的多个人脸,那么图片的命名可能会有bug - import cv2 import os import glob #最后剪裁的图片大小 size_m = 48 size_n = 48 def detect(img, cascade): rects = cascade.detectMultiScale(img, scaleFactor=1

18.n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。 当一个数字删除后,从被删除数字的下一个继续删除第m个数字。 求出在这个圆圈中剩下的最后一个数字。

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4263868.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字). 当一个数字

ps中如何用抽出功能扣取头发

一些图片中需要扣取人的头发,非常不好扣,本文介绍抽取扣除 打开一个人物图片,用ctrj+j分别复制几个图层,从下往上分别为:背景副本,图层2(用于修改成别的背景),图层1抽头发白色(用于抽头发,强制前景颜色白色),图层2抽头发黑色(抽头发,强制前景颜色黑色),抽任务图层1(用钢笔工具选出除头发外的其他主身体部位).

【数字图像处理之(一)】数字图像处理与相关领域概述

数字图像(Digital Image) 一副图像可以定义为一个二维函数f(x, y),这里的x和y是空间坐标,而在任意坐标(x, y)处的幅度f被称为这一坐标位置图像的亮度或灰度.当x.y和f的幅值都是有限的离散值时,称为数字图像.注意,数字图像由有限数量的元素组成,每个元素都有特殊的位置和数值.这些元素称为画像元素.图像元素和像素,像素是定义数字图像元素时使用最广泛的术语. --Digital Image Pricessing Using MATLAB( Rafacel C. Gonzalez

剑指Offer对答如流系列 - 数字序列中某一位的数字

面试题44:数字序列中某一位的数字 题目描述 数字以0123456789101112131415-的格式序列化到一个字符序列中.在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等.请写一个函数求任意位对应的数字. 问题分析 这个寻求高效的解决方法,也是寻找规律: 个位数的个数一共有10个,即0~9,共占了10*1位数字:(特殊) 两位数的个数一共有90个,即10~99,每个数字占两位,共占了90*2位数字: -- m位数的个数一共有9*10^(m-1)个,每个数字占m位,

php在数字前面补0得到固定长度数字的两种方法

比较基础,其实两个内置函数都能实现. 1  sprintf 语法: string sprintf(string format, mixed [args]...); 返回值: 字符串 函数种类: 资料处理 本函数用来将字符串格式化.参数 format 是转换的格式,以百分比符号 % 开始到转换字符为止.而在转换的格式间依序包括了 填空字符.0 的话表示空格填 0:空格是默认值,表示空格就放着. 对齐方式.默认值为向右对齐,负号表向左对齐. 字段宽度.为最小宽度. 精确度.指在小数点后的浮点数位数.

BZOJ 1833 数字计数(统计[a,b]每个数字出现次数)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1833 题意:给定区间[a,b].求区间内0到9每个数字出现的次数. 思路:f[i][j]表示到后i位是否全 0(j=1表示i位之前全0)这个状态某个数字出现的次数,p[i][j]表示这个状态后面有多少个数字.那么当前枚举到的数字为要统计的数字时,答案加 上后面还有多少种数字,即下一个状态的p值.那么我们枚举要统计的数字依次统计即可. i64 f[20][2],p[20][2]; i64

java循环练习:用户输入一个10以内的数字,通过运算求出该数字的阶乘

package practiceGO; import java.util.Scanner; /*  * 4.用户输入一个10以内的数字,通过运算求出该数字的阶乘  */ public class Cto { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个10以内的数字,由系统计算阶乘"); int num = sc.nextIn