【问题标题】:Bilateral Filtering preserves the edge, but I want the opposite, an edge -bluring filter?双边过滤保留边缘,但我想要相反的边缘模糊过滤器?
【发布时间】:2015-09-16 02:19:26
【问题描述】:

是否有这样一种过滤器可以模糊边缘同时保留边界内的所有内容?

【问题讨论】:

    标签: opencv image-processing computer-vision


    【解决方案1】:

    我认为没有这样的过滤器!但是如果你想要一个,你必须写一个!这是我的边缘平滑算法!希望你会发现这很有用!

    bool SmoothEdge( Mat mInput_Bgr,Mat &mOutput_Bgr, double amount, double radius, byte Threshold) 
    {
        if(mInput_Bgr.empty())
        {
            return 0;
        }
    
        if(radius<1)
            radius=1;
    
        Mat mInput,mOutput;
        Mat mChannel[3];
    
        split(mInput_Bgr,mChannel);
    
        for (int i = 0; i < 3; i++)
        {
            mInput= mChannel[i];
            SmoothEdgeSingleChannel(mInput,mOutput,amount, radius,Threshold); 
            mOutput.copyTo(mChannel[i]);
        }
        merge(mChannel,3,mOutput_Bgr);
    
    
        return true;
    }
    
    bool SmoothEdgeSingleChannel( Mat mInput,Mat &mOutput, double amount, double radius, byte Threshold) 
    {
        if(mInput.empty())
        {
            return 0;
        }
        if(radius<1)
            radius=1;
    
        Mat mGSmooth,mDiff,mAbsDiff;
        mOutput = Mat(mInput.size(),mInput.type());
    
        GaussianBlur(mInput,mGSmooth,Size(0,0),radius); 
    
        subtract(mGSmooth,mInput,mDiff);
        mDiff*=amount;
        threshold(abs(2* mDiff),mAbsDiff,Threshold,255,THRESH_BINARY_INV);
    
        mDiff.setTo(Scalar(0),mAbsDiff);
    
        add(mInput,mDiff,mOutput);
    
        return true;
    }
    
    int main(int argc, char* argv[])
    {
        string FileName_S="Path\\Image.jpg";
        double m_Amount=1.5;
        double m_Radius=5.5;
        int m_Threshold=0;
    
        Mat mSource_Bgr,mSmoothEdge;
        mSource_Bgr= imread(FileName_S,1);
    
        SmoothEdge(mSource_Bgr,mSmoothEdge,m_Amount,m_Radius,m_Threshold);
    
        imshow("Source Image",mSource_Bgr);
        imshow("Output Image",mSmoothEdge); 
    }
    

    这是我的结果: 输入图片

    输出:

    【讨论】:

    • 您好,感谢您的努力!这很棒!但是很遗憾我只写了python......你能解释一下你的过滤器的理论,以便我可以在python上重现它吗?
    • @wudanao 一开始没有提到你只会接受 Python 代码不仅适得其反,而且非常粗鲁。
    • @wudanao 代码主要是调用OpenCV函数,翻译成python应该很简单。不错的解决方案!
    • @beaker 我不认为我曾经说过我不会接受代码?我只是说我想要一些关于这个过滤器如何模糊边缘的理论。
    • 这是一个非常好的解决方案。直线前进。但是,如果您对每个处理步骤添加一些解释,这样可能会有所帮助,以便不精通 OpenCV 的人可以复制该算法。
    猜你喜欢
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2021-02-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多