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

Python实现指定中心点图像径向等分并提取分区像素值方法咨询

实现思路
  • 先确定分割的中心点坐标,支持手动指定,也可默认取图像几何中心。
  • 为图像上所有像素计算相对于中心点的极坐标参数:核心是每个像素对应的极角(即像素点和中心点连线与水平轴的夹角,统一映射到0~2π区间)。
  • 根据指定的分区总数,计算每个径向扇形分区的角度边界,n个分区对应每个分区的角度跨度为2π/n。
  • 逐一生成每个分区的二值掩码:极角落在对应角度区间内的像素标记为有效区域,其余为无效区域。
  • 用生成的掩码直接索引图像数组,即可提取对应分区内的所有像素强度值。
参考代码

依赖库为numpy和opencv-python,可直接运行调试:

import numpy as np
import cv2

def radial_partition_extract(img, center=None, sector_num=8):
    """
    径向分割图像并提取各分区像素
    :param img: 输入图像,支持单通道灰度图/三通道彩图
    :param center: 分割中心点坐标格式为(cx, cy),传None则默认取图像几何中心
    :param sector_num: 等角度分割的分区总数
    :return: 各分区像素值列表、各分区二值掩码列表
    """
    h, w = img.shape[:2]
    cx, cy = center if center is not None else (w//2, h//2)

    # 构建全图像素坐标网格
    y_grid, x_grid = np.ogrid[:h, :w]
    dx = x_grid - cx
    dy = y_grid - cy

    # 计算每个像素相对中心点的极角,范围映射到0~2π
    theta = np.arctan2(dy, dx) + np.pi
    angle_step = 2 * np.pi / sector_num

    sector_pixels = []
    sector_masks = []

    for sector_idx in range(sector_num):
        # 计算当前分区的角度范围
        angle_low = sector_idx * angle_step
        angle_high = (sector_idx + 1) * angle_step
        # 生成分区掩码
        cur_mask = (theta >= angle_low) & (theta < angle_high)
        # 提取当前分区的所有像素
        cur_pixels = img[cur_mask]
        sector_pixels.append(cur_pixels)
        sector_masks.append(cur_mask)

        # 可视化验证:弹出窗口显示当前选中分区
        vis = img.copy()
        if len(vis.shape) == 2:
            vis = cv2.cvtColor(vis, cv2.COLOR_GRAY2BGR)
        vis[cur_mask] = (255, 0, 0)  # 蓝色标记当前分区
        cv2.circle(vis, (cx, cy), 5, (0, 0, 255), -1)  # 红色标记中心点
        cv2.imshow(f"分区{sector_idx+1}", vis)
        cv2.waitKey(0)
    cv2.destroyAllWindows()

    return sector_pixels, sector_masks

# 调用示例
if __name__ == "__main__":
    # 替换为你的本地图像路径
    img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
    # 自定义中心点,比如(320, 240)
    center_point = (320, 240)
    # 分割为8个等间隔径向分区
    pixels, masks = radial_partition_extract(img, center=center_point, sector_num=8)
    # 例:打印第1个分区的像素数量
    print(f"第1个分区提取像素数:{len(pixels[0])}")
补充说明
  • 上述代码实现的是和示意图一致的等角度扇形分区,如果需要做环形径向分割,只要额外计算每个像素到中心点的距离r = np.sqrt(dx**2 + dy**2),再按半径区间生成掩码即可。
  • 中心点可根据需求扩展交互选点能力:借助opencv的鼠标回调函数,点击图像即可记录点击位置作为分割中心点。
  • 提取出的像素数组保留原图像通道结构,三通道彩图对应数组形状为(分区像素总数, 3),单通道灰度图为(分区像素总数,),可直接用于后续强度统计、特征计算等操作。

需求示意图

内容的提问来源于stack exchange,提问作者anad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:01:46