zoukankan      html  css  js  c++  java
  • 寻找图片中数字的轮廓并裁剪 扣取数字

    本次数字图片来自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)

    显示效果:

      

  • 相关阅读:
    个人作业——软件评测
    结对第二次作业
    寒假作业(2/2)
    寒假作业(1/2)
    markdown整理
    我们一定会在人生的更高处相见的
    时间复杂度 分析 可能算法
    有关数学 结论 规律 题目 小结
    jzyz 题库 选做 及 知识小结
    隔板法
  • 原文地址:https://www.cnblogs.com/carlber/p/9822524.html
Copyright © 2011-2022 走看看