如何用Python从带mask的图像提取土壤纹理并生成240x240纹理图像?
基于已有Mask提取土壤纹理并生成240x240纹理图像的实现方案
前提条件
- 原始土壤图像(对应示例图)
- 与图像尺寸匹配的二值Mask(白色区域为土壤,黑色为非土壤)
步骤1:提取土壤区域的有效像素
从原始图像中提取Mask覆盖的土壤像素,作为纹理生成的素材库:
import cv2 import numpy as np # 加载图像和Mask img = cv2.imread("soil_image.jpg") mask = cv2.imread("soil_mask.jpg", 0) # 以灰度图加载Mask # 确保Mask是标准二值图(非土壤区域为0,土壤区域为255) mask = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY)[1] # 提取土壤区域的所有像素 soil_pixels = img[mask == 255]
步骤2:生成240x240纹理图像
提供两种实现方式,按需选择:
方式一:随机采样填充(简单快速)
直接从土壤像素库中随机选取像素填充目标图像,适合对纹理连贯性要求不高的场景:
# 创建240x240的空白图像 target_size = (240, 240) generated_img = np.zeros((target_size[0], target_size[1], 3), dtype=np.uint8) # 随机填充像素 for i in range(target_size[0]): for j in range(target_size[1]): # 随机选取一个土壤像素 rand_idx = np.random.randint(0, len(soil_pixels)) generated_img[i, j] = soil_pixels[rand_idx] # 保存结果 cv2.imwrite("generated_soil_texture.jpg", generated_img)
方式二:基于块的纹理合成(更自然连贯)
使用scikit-image的纹理合成工具,生成更接近真实土壤纹理的图像:
from skimage import texture, io # 转换图像格式为RGB(scikit-image默认RGB) img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 将Mask转为布尔型用于限定采样区域 mask_bool = mask.astype(bool) # 生成240x240纹理图像 generated_texture = texture.synthesize( img_rgb, mask=mask_bool, size=(240, 240), max_pad_size=10, random_state=42 ) # 保存结果 io.imsave("natural_soil_texture.jpg", generated_texture)
注意事项
- 必须保证Mask与原始图像的宽高完全一致,否则会出现像素提取错位
- 若生成图像色调偏差明显,可对提取的
soil_pixels做直方图均衡化后再填充 - 块合成方式需提前安装依赖:
pip install scikit-image
内容的提问来源于stack exchange,提问作者Vikas Kumar Ojha
相关产品推荐
相关产品推荐

