zoukankan      html  css  js  c++  java
  • 利用python,opencv来去除图像的黑边(上下左右都有黑边的)

    利用python,opencv来去除图像的黑边(上下左右都有黑边的)

    """author:youngkun;date:20180608;function:裁剪照片的黑边"""
     
    import cv2
    import os
    import datetime
     
    def change_size(read_file):
        image=cv2.imread(read_file,1) #读取图片 image_name应该是变量
        img = cv2.medianBlur(image,5) #中值滤波,去除黑色边际中可能含有的噪声干扰
        b=cv2.threshold(img,15,255,cv2.THRESH_BINARY)          #调整裁剪效果
        binary_image=b[1]               #二值图--具有三通道
        binary_image=cv2.cvtColor(binary_image,cv2.COLOR_BGR2GRAY)
        print(binary_image.shape)       #改为单通道
     
        x=binary_image.shape[0]
        print("高度x=",x)
        y=binary_image.shape[1]
        print("宽度y=",y)
        edges_x=[]
        edges_y=[]
        for i in range(x):
            for j in range(y):
                if binary_image[i][j]==255:
                 edges_x.append(i)
                 edges_y.append(j)
     
        left=min(edges_x)               #左边界
        right=max(edges_x)              #右边界
        width=right-left                #宽度
        bottom=min(edges_y)             #底部
        top=max(edges_y)                #顶部
        height=top-bottom               #高度
     
        pre1_picture=image[left:left+width,bottom:bottom+height]        #图片截取
        return pre1_picture                                             #返回图片数据
     
    source_path="./training_data/1/"                                    #图片来源路径
    save_path="./out/"                                     #图片修改后的保存路径
     
    if not os.path.exists(save_path):
        os.mkdir(save_path)
     
    file_names=os.listdir(source_path)
     
    starttime=datetime.datetime.now()
    for i in range(len(file_names)):
        x=change_size(source_path + file_names[i])        #得到文件名
        cv2.imwrite(save_path+file_names[i],x)
        print("裁剪:",file_names[i])
        print("裁剪数量:",i)
        while(i==2600):
            break
    print("裁剪完毕")
    endtime = datetime.datetime.now()#记录结束时间
    endtime = (endtime-starttime).seconds
    print("裁剪总用时",endtime)

    这种方法只能裁剪出矩形的图像,具有一定的局限性,利用了opencv的二值化来分离出前景和背景

    完整代码请见
    https://github.com/younkun/image_image-processing.git

  • 相关阅读:
    bat学习
    Eclipse调试方法及快捷键
    JDK中的设计模式
    开源-自由-乔布斯
    AOP
    编程语言
    [LeetCode] 160. Intersection of Two Linked Lists(两个单链表的交集)
    [LeetCode] 198. House Robber(小偷)
    [LeetCode] 155. Min Stack(最小栈)
    [LeetCode] 1. Two Sum(两数之和)
  • 原文地址:https://www.cnblogs.com/yumoye/p/10512540.html
Copyright © 2011-2022 走看看