如何解决基于3D数组numpy创建2D数组
基于3D数组创建2D数组的最有效方法是什么?我有以下输入3D数组,该数组对图片的rgb信息进行编码:
[[[[255,255,255],[255,255],...]]
我想创建一个新的2D数组,本质上是一个遮罩,检查rgb值是否超过某个阈值:
[[true,false,true,false,...]]
当我对每个rgb值进行运算时,我正在执行一系列的乘法,加法和sqrts,并且此运算的最终值确定2D数组输出的值,是true还是false。
谢谢。
编辑: 我正在尝试将此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;
}
}
解决方法
我认为您正在寻找的是
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。