基于三维阵列numpy创建二维阵列

2024-09-28 22:04:45 发布

您现在位置:Python中文网/ 问答频道 /正文

基于3D阵列创建2D阵列的最有效方法是什么?我有以下输入3D数组,它对图片的rgb信息进行编码:

[255255],[255255],[255255],…]

我想创建一个新的2D阵列,它本质上是一个遮罩,检查rgb值是否超过某个阈值:

[true,false,true,false,…]

当我对每个rgb值进行操作时,我正在执行一系列乘法、加法和SQRT,此操作的最终值确定2D数组输出的值,为真或假

提前谢谢

编辑: 我正在尝试将C++代码转换为Python:

cv::Mat diffImage;
cv::absdiff(backgroundImage, currentImage, diffImage);

cv::Mat foregroundMask = cv::Mat::zeros(diffImage.rows, diffImage.cols, CV_8UC1);

float threshold = 30.0f;
float dist;

for(int j=0; j<diffImage.rows; ++j)
    for(int i=0; i<diffImage.cols; ++i)
    {
        cv::Vec3b pix = diffImage.at<cv::Vec3b>(j,i);

        dist = (pix[0]*pix[0] + pix[1]*pix[1] + pix[2]*pix[2]);
        dist = sqrt(dist);

        if(dist>threshold)
        {
            foregroundMask.at<unsigned char>(j,i) = 255;
        }
    }

Tags: falsetrueforthresholddistrgb数组float
1条回答
网友
1楼 · 发布于 2024-09-28 22:04:45

我想你要找的是

np.sqrt(np.sum(image ** 2, axis=2)) > threshold

更好的办法是写:

np.sum(image**2, axis=2) > threshold ** 2

因为平方阈值比求数组中每个元素的平方根要快

我认为您也可以使用axis=-1,这样它总是沿着最后一个轴求和,而不管数组的维数如何

@MichaelChang提醒我sum既是一个函数也是一个方法。这可以更简单地改写为:

(images**2).sum(axis=2) > threshold ** 2

相关问题 更多 >