• 利用python和opencv批量去掉图片黑边


    import os
    import cv2
    import numpy as np
    from scipy.stats import mode
    import time
    import concurrent.futures
    
    '''
        multi-process to crop pictures.
    '''
    
    
    def crop(file_path_list):
        origin_path, save_path = file_path_list
        img = cv2.imread(origin_path)
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
        closed_1 = cv2.erode(gray, None, iterations=4)
        closed_1 = cv2.dilate(closed_1, None, iterations=4)
        blurred = cv2.blur(closed_1, (9, 9))
        # get the most frequent pixel
        num = mode(blurred.flat)[0][0] + 1
        # the threshold depends on the mode of your images' pixels
        num = num if num <= 30 else 1
    
        _, thresh = cv2.threshold(blurred, num, 255, cv2.THRESH_BINARY)
    
        # you can control the size of kernel according your need.
        kernel = np.ones((13, 13), np.uint8)
        closed_2 = cv2.erode(thresh, kernel, iterations=4)
        closed_2 = cv2.dilate(closed_2, kernel, iterations=4)
    
        _, cnts, _ = cv2.findContours(closed_2.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
    
        # compute the rotated bounding box of the largest contour
        rect = cv2.minAreaRect(c)
        box = np.int0(cv2.boxPoints(rect))
    
        # draw a bounding box arounded the detected barcode and display the image
        # cv2.drawContours(img, [box], -1, (0, 255, 0), 3)
        # cv2.imshow("Image", img)
        # cv2.imwrite("pic.jpg", img)
        # cv2.waitKey(0)
    
        xs = [i[0] for i in box]
        ys = [i[1] for i in box]
        x1 = min(xs)
        x2 = max(xs)
        y1 = min(ys)
        y2 = max(ys)
        height = y2 - y1
        width = x2 - x1
        crop_img = img[y1:y1 + height, x1:x1 + width]
        cv2.imwrite(save_path, crop_img)
        # cv2.imshow("Image", crop_img)
        # cv2.waitKey(0)
        print(f'the {origin_path} finish crop, most frequent pixel is {num}')
    
    
    def multi_process_crop(input_dir):
        with concurrent.futures.ProcessPoolExecutor() as executor:
            executor.map(crop, input_dir)
    
    
    if __name__ == "__main__":
        data_dir = ''
        save_dir = ''
        path_list = [(os.path.join(data_dir, o), os.path.join(save_dir, o)) for o in os.listdir(data_dir)]
        start = time.time()
        multi_process_crop(path_list)
        print(f'Total cost {time.time()-start} seconds')
    
  • 相关阅读:
    获得ip地理信息的几种方法
    设置 phoneGap/Cordova 3.4 应用程序启动动画闪屏 SplashScreen
    backbone实例01
    即使世界明天毁灭,我今天也要种下葡萄树
    真言真语
    美文美句
    25个实用的jQuery技巧和解决方案
    突袭HTML5之WebGL 3D概述
    敏捷开发之Scrum扫盲篇
    javascript中undefined和null的区别详解
  • 原文地址:https://www.cnblogs.com/laresh/p/9551518.html
Copyright © 2020-2023  润新知