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

基于Python的二值图像4×4分块及像素计数处理需求

解决二值图像4×4块奇偶统计并保存结果的问题

我看了你的代码,确实存在几个关键问题导致达不到预期效果,咱们一步步来修正:

先说说你的代码里的核心问题

  • 循环遍历方式错了:你现在是逐个像素遍历,这会导致同一个4×4块被重复处理N次,完全不符合“按块划分”的需求——应该以4为步长,每次跳一个块的位置
  • 判断逻辑不符合需求:你用sum>4或sum<4来赋值,但需求是统计黑色像素数的奇偶性,和数值大小无关
  • 修改原图像会污染数据:你在循环里直接修改image数组,后面的块计算会用到已经被修改后的像素值,结果肯定不对
  • 二值化处理缺失:plt.imread读取的图像可能是0-1的浮点数或者RGB转单通道后的非严格二值,需要先转成明确的0(黑)、1(白)数组

修正后的完整代码

import numpy as np
from PIL import Image

# 1. 读取并预处理二值图像
# 用PIL读取更稳定,先转灰度再转严格二值
image = Image.open('myplot1.png').convert('L')
image_np = np.array(image)
# 阈值化:灰度值<128的是黑色(标记为0),否则是白色(标记为1)
# 如果你原图像的黑色是1、白色是0,就把条件改成>128
binary_image = np.where(image_np < 128, 0, 1)

# 2. 定义块大小,计算可划分的完整块数量
block_size = 4
height, width = binary_image.shape
num_blocks_h = height // block_size  # 垂直方向的块数
num_blocks_w = width // block_size  # 水平方向的块数

# 3. 创建结果数组,存储每个块的0/1赋值
block_result = np.zeros((num_blocks_h, num_blocks_w), dtype=np.int32)

# 4. 逐个处理每个4×4块
for i in range(num_blocks_h):
    for j in range(num_blocks_w):
        # 提取当前块的区域
        current_block = binary_image[i*block_size : (i+1)*block_size, 
                                    j*block_size : (j+1)*block_size]
        # 统计黑色像素数量(这里黑色是0,所以统计等于0的像素数)
        black_count = np.sum(current_block == 0)
        # 奇偶判断:奇数赋值1,偶数赋值0
        block_result[i, j] = 1 if black_count % 2 != 0 else 0

# 5. 把结果保存到TXT文件
# fmt='%d'表示保存为整数,delimiter=' '用空格分隔
np.savetxt('block_parity_result.txt', block_result, fmt='%d', delimiter=' ')

# 可选:如果需要把每个块替换后的完整图像保存
output_image = np.zeros_like(binary_image)
for i in range(num_blocks_h):
    for j in range(num_blocks_w):
        output_image[i*block_size:(i+1)*block_size, j*block_size:(j+1)*block_size] = block_result[i,j]
# 转成uint8格式保存为图片
Image.fromarray((output_image * 255).astype(np.uint8)).save('processed_image.png')

关键细节说明

  • 图像二值化:这里假设你的原图中黑色是较暗的像素,所以用128作为阈值分割。如果你的二值图本身就是0(黑)和255(白)的格式,可以直接改成binary_image = (image_np == 0).astype(np.int32)
  • 边界处理:代码里只处理了尺寸是4的倍数的区域,如果你的图像宽高不是4的倍数,边缘剩余的像素可以选择丢弃,或者补0凑成4×4块(比如用np.pad给图像补边)
  • 结果保存:np.savetxt会把二维数组按行写入TXT,每行的数字用空格分隔,方便后续读取
  • 避免原数据污染:我们单独创建了block_result数组存储结果,完全不修改原图像,确保每个块的计算都是基于原始像素值

内容的提问来源于stack exchange,提问作者Dian Arief R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:21:02