利用 python opencv 批量图片进行裁剪

#!/usr/bin/env python
# -*- coding: utf-8 -*-


from utils.utils import Directory_Hanlder  # Directory_Hanlder代码链接:https://blog.csdn.net/qq_16555103/article/details/107146429
import os
import time
import re
from tqdm import tqdm
import cv2
import numpy as np
import argparse

# 读取带有中文路径的图片
def cn_imread(filePath):
    try:
        cv_img = cv2.imdecode(np.fromfile(filePath, dtype=np.uint8), cv2.IMREAD_COLOR)
        """ 
        cv2.imdecode 参数与 cv2.imread 打开的图片相似,如果不需要第四通道,选择 cv2.IMREAD_COLOR,此时读取图片的格式为 bgr
        cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1。
        cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0。
        cv2.IMREAD_UNCHANGED:包括alpha,可以直接写-1
        """
    except Exception as e:
        print('当前图片opencv无法读取,原因为:\n{}'.format(e))
        cv_img = None
    return cv_img

# 保存带有中文路径的图片
def cn_imwrite(file_path , img_array): 
    # 这个方法需要特别注意,img_array一定是一个BGR格式的uint8 ndarray
    cv2.imencode('.jpg', img_array)[1].tofile(file_path)
    

def single_img_save(img_array,report_path,img_name):
    """
    输入 img BGR格式的数组,保存图片【.jpg】到指定路径
    :param img_array:
    :return:
    """
    img_path = os.path.join(report_path,img_name)
    cn_imwrite(img_path,img_array)
    # cv2.imwrite(img_path, img_array)

def single_img_intercept(fpath,top=0.0,battle=0.125):
    """
    给定一张需要剪切的图片的路径 与 图片上下需要剪切的比例
    :param fpath: 图片的路径
    :param top: 图片上侧的比例
    :param battle: 图片下侧的比例
    :return:
    """
    
    img = cn_imread(fpath)
    if img is None:
        return None
    img_shape = img.shape
    height,weight = img_shape[0],img_shape[1]

    height_start = int(np.floor(top*height))
    height_end = int(-1 * np.floor(battle*height))

    img = img[height_start:height_end]
    return img



if __name__ == '__main__':

    # 创建对象
    parser = argparse.ArgumentParser()

    # 添加参数
    parser.add_argument('--Dir', help='source dir',type=str)
    parser.add_argument('--top', help='top value',type=float)
    parser.add_argument('--battle', help='battle value',type=float)

    # 使用parse_args解析参数
    args = parser.parse_args()
    dir_ = args.Dir
    top = args.top
    battle = args.battle
    
    # 构建路径
    source_dir = dir_
    report_dir_path = os.path.join(source_dir, 'report_img')
    Directory_Hanlder.check_directory(report_dir_path)
    Directory_Hanlder.clean_directory(report_dir_path)

    # 遍历文件夹下所有的文件
    files_path, dirs_path = Directory_Hanlder.list_dir_all_files(source_dir)

    # 重写图片名
    for idx,img in tqdm(enumerate(files_path)):
        # 将指定的文件img复制到report_dir_path的文件夹里面
        img_array = single_img_intercept(img,top=top,battle=battle)
        if img_array is None:
            continue

        img_name = img.split('\\')[-1]
        # 保存
        single_img_save(img_array,report_dir_path,img_name)

参考:OpenCV—Python 图像指定区域裁剪

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下步骤批量去掉图片黑边: 1. 导入opencv库和os库 ```python import cv2 import os ``` 2. 定义函数,用于去掉图片黑边 ```python def remove_black_edge(image_path, save_path): # 读取图片 img = cv2.imread(image_path) # 将图片转为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理 ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU) # 查找轮廓 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) # 寻找最大轮廓 max_area = 0 contour_index = 0 for index in range(len(contours)): contour = contours[index] area = cv2.contourArea(contour) if area > max_area: max_area = area contour_index = index # 获取最大轮廓的矩形框 x, y, w, h = cv2.boundingRect(contours[contour_index]) # 裁剪图片 img_cropped = img[y:y+h, x:x+w] # 保存图片 cv2.imwrite(save_path, img_cropped) ``` 3. 循环遍历文件夹中的图片,调用函数去掉黑边并保存 ```python # 图片所在文件夹路径 folder_path = "path/to/folder" # 遍历文件夹中的所有图片 for filename in os.listdir(folder_path): if filename.endswith(".jpg") or filename.endswith(".png"): # 图片路径 image_path = os.path.join(folder_path, filename) # 去掉黑边后保存的路径 save_path = os.path.join(folder_path, "no_black_edge_" + filename) # 去掉黑边并保存 remove_black_edge(image_path, save_path) ``` 以上就是利用pythonopencv批量去掉图片黑边的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值