首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在OpenCV中计算像素值之间的距离长度

在OpenCV中计算像素值之间的距离长度
EN

Stack Overflow用户
提问于 2016-11-02 02:11:37
回答 2查看 317关注 0票数 3

我需要创建两个图像的差异图像,并希望有每个像素的差异的大小/长度

我目前正在这样做:

代码语言:javascript
运行
复制
cv::Mat diff = cv::abs(img1 - img2);
cv::Mat diffLen(diff.size(), CV_32FC1);
for(int x = 0; x < diff.size().width; ++x)
    for(int y = 0; y < diff.size().height; ++y)
    {
        float d = cv::norm(diff.at<Vec3f>(Point(x,y)));
        diffLen.at<float>(Point(x,y)) = d;
    }

有没有更方便的方法来做这件事?

EN

回答 2

Stack Overflow用户

发布于 2020-07-18 15:43:55

我正在寻找一个类似的目的,现在我得到了:

代码语言:javascript
运行
复制
    cv::Mat diff = cv::abs(img1 - img2);
    diff = diff.mul(diff);
    cv::transform(diff, diff, cv::Mat::ones(1, diff.channels(), CV_32F));
    cv::sqrt(diff, diff);

这并不优雅。但是opencv似乎并没有提供“像素标准”操作。

票数 2
EN

Stack Overflow用户

发布于 2016-11-02 16:42:52

也许你可以使用ParallelLoopBody:

代码语言:javascript
运行
复制
class ParallelNorm : public ParallelLoopBody
{
private:
    Mat &diff;
    Mat &diffLen;

public:
    ParallelNorm(Mat& pDiff,Mat &result) :
        diff(pDiff),
        diffLen(result)
        {}
    virtual void operator()(const Range& range) const
    {

        for (int x = range.start; x < range.end; ++x)
        {
            for (int y = 0; y < diffLen.rows; ++y)
            {
                float d = cv::norm(diff.at<Vec3f>(Point(x, y)));
                diffLen.at<float>(Point(x, y)) = d;
            }

        }
    }
};

而不是使用你的循环

代码语言:javascript
运行
复制
ParallelNorm x(diff,diffLen);
parallel_for_(Range(0,diff.cols),x);

在循环中,如果你交换x和y,你可以使用指针...

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40366034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档