试着用python写一段代码,能够实现将文件夹中的所有图片去掉黑色背景,裁成128*128大小的图像块
时间: 2024-04-15 12:31:11 浏览: 17
Sure! Here's an example code snippet in Python that uses the OpenCV library to remove the black background from images in a folder crop them into 128x128 image blocks```python
import cv2
import os
def remove_black_background(image):
# Convert image to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Threshold the grayscale image to create a binary mask
_, mask = cv2.threshold(gray, 1, 255, cv2.THRESH_BINARY)
# Find contours in the mask
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Find the largest contour
largest_contour = max(contours, key=cv2.contourArea)
# Create a mask for the largest contour
mask = cv2.drawContours(mask, [largest_contour], 0, (255, 255, 255), thickness=cv2.FILLED)
# Bitwise-AND the original image with the mask to remove the black background
result = cv2.bitwise_and(image, image, mask=mask)
return result
def crop_image_blocks(image, block_size):
# Get the dimensions of the image
height, width = image.shape[:2]
# Calculate the number of blocks in each dimension
num_blocks_x = width // block_size
num_blocks_y = height // block_size
cropped_images = []
# Iterate through each block and crop the image
for y in range(num_blocks_y):
for x in range(num_blocks_x):
start_x = x * block_size
start_y = y * block_size
end_x = (x + 1) * block_size
end_y = (y + 1) * block_size
cropped_image = image[start_y:end_y, start_x:end_x]
cropped_images.append(cropped_image)
return cropped_images
def process_images(input_folder, output_folder, block_size=128):
# Create the output folder if it doesn't exist
os.makedirs(output_folder, exist_ok=True)
# Get the list of image file names in the input folder
image_files = [f for f in os.listdir(input_folder) if f.endswith('.jpg') or f.endswith('.png')]
for image_file in image_files:
# Read the image
image_path = os.path.join(input_folder, image_file)
image = cv2.imread(image_path)
# Remove black background
image = remove_black_background(image)
# Crop image into blocks
cropped_images = crop_image_blocks(image, block_size)
# Save cropped images
for i, cropped_image in enumerate(cropped_images):
output_file = f"{os.path.splitext(image_file)[0]}_{i}.png"
output_path = os.path.join(output_folder, output_file)
cv2.imwrite(output_path, cropped_image)
# Example usage
input_folder = '/path/to/input/folder'
output_folder = '/path/to/output/folder'
process_images(input_folder, output_folder)
```
Make sure to replace `'/path/to/input/folder'` and `'/path/to/output/folder'` with the actual paths to your input and output folders. The code assumes that the input folder contains only image files (JPEG or PNG).