You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:00:56