如何快速从图像二维数组中剔除周围零值提取有效数据?
提取灰度图像中的有效数据矩形子数组
没问题,我来帮你搞定这个需求!你已经用OpenCV把PNG转成了灰度numpy数组,接下来只需要找到所有非零像素的边界,然后用切片提取对应的子数组就行,具体步骤如下:
步骤说明
- 定位所有非零像素的坐标
- 计算这些坐标的最小/最大行、列值,确定有效区域的边界
- 通过numpy切片提取该矩形区域
完整代码示例
结合你已有的代码,完整实现如下:
import cv2 import numpy as np # 读取图像并转为灰度 img = cv2.imread("./images/test.png") img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 找到所有非零像素的坐标 non_zero_coords = np.where(img != 0) # 处理全零图像的特殊情况 if len(non_zero_coords[0]) == 0: cropped_img = img.copy() else: # 确定有效区域的边界 min_row = np.min(non_zero_coords[0]) max_row = np.max(non_zero_coords[0]) min_col = np.min(non_zero_coords[1]) max_col = np.max(non_zero_coords[1]) # 提取子数组(切片左闭右开,所以max要+1) cropped_img = img[min_row : max_row + 1, min_col : max_col + 1]
代码解释
np.where(img != 0):返回两个数组,分别是所有非零像素的行索引和列索引np.min()/np.max():从索引数组中取出最小/最大值,得到有效区域的上下左右边界- 切片
img[min_row : max_row+1, min_col : max_col+1]:因为numpy切片是左闭右开区间,所以要给max值加1,确保最后一行/列的有效像素被包含进去
比如你给出的示例输入数组,这段代码会自动定位到第一个非零值和最后一个非零值的位置,精准提取出中间的有效数据部分。
内容的提问来源于stack exchange,提问作者Chupo_cro
相关产品推荐
相关产品推荐

