【问题标题】:Anisotropic diffusion 2d images [closed]各向异性扩散二维图像
【发布时间】:2012-06-03 21:08:44
【问题描述】:

我想在 2d 图像上使用各向异性扩散。

我想使用 python 但不介意使用 matlab 或 c。 我可以使用他们的任何库作为第一步吗?我对该主题进行了谷歌搜索,发现了 Panda3D 和 OpenGl。
基本上我想给一组图像让它应用过滤,然后将新图像输出到我想要的文件夹。

有关如何使用其中任何一种或您认为更好的方法的任何提示?

编辑:意思是扩散对不起!

【问题讨论】:

    标签: python c image matlab filtering


    【解决方案1】:

    你不是说Anisotropic diffusion? C 可能是最好的(比 matlab 和 python 更快)。但是matlab中有一个用于图像分析的工具箱:matlabimagetoolbox。 我制作了一个在 c 中进行各向同性扩散的程序,我使用的唯一库是 libjpeg 用于导入和导出图像。

    【讨论】:

    • 哦,是的,对不起,我的错。我的意思是扩散!我对你在 c 中是如何做到的很感兴趣。我该怎么做呢?
    • 不是为了家庭作业,而是为了大学的一个项目。他们需要有人来创造一个,我想通过创造来学习。我今天刚听说各向异性,所以我正在努力研究它。感谢您提供的信息,我在 C 方面不是很先进,但我会看看我能做什么。我会看看我是否能找到关于解析图像以浮动等的任何内容。
    • 图像数据(如果是灰度)在一个无符号字符数组中。解析,float_image =(float)char_image_data。如果您需要更多帮助,我可以发布一些代码。
    【解决方案2】:

    Here's 我的 2D 和 3D 各向异性 (Perona-Malik) 扩散的 Python/numpy 实现。它没有 C 代码那么快,但它对我来说做得很好。

    【讨论】:

    • 哇,非常感谢!抱歉耽搁了,刚看到这个,很有帮助!
    • 很高兴听到这个消息。如果对您有用,请将我的回答标记为已接受。
    • 还没有那么多代表!一旦我有足够的,我一定会的!
    • 实际上 Perona Malik 是各向同性(非线性)扩散。
    • @ali_m,您是否两次应用了 Div 运算符?
    【解决方案3】:
    import math
    try:
        from cv2 import cv2
    except:
        import cv2
    import numpy as np
    
    
    class anisodiff2D(object):
    
        def __init__(self,num_iter=5,delta_t=1/7,kappa=30,option=2):
    
            super(anisodiff2D,self).__init__()
    
            self.num_iter = num_iter
            self.delta_t = delta_t
            self.kappa = kappa
            self.option = option
    
            self.hN = np.array([[0,1,0],[0,-1,0],[0,0,0]])
            self.hS = np.array([[0,0,0],[0,-1,0],[0,1,0]])
            self.hE = np.array([[0,0,0],[0,-1,1],[0,0,0]])
            self.hW = np.array([[0,0,0],[1,-1,0],[0,0,0]])
            self.hNE = np.array([[0,0,1],[0,-1,0],[0,0,0]])
            self.hSE = np.array([[0,0,0],[0,-1,0],[0,0,1]])
            self.hSW = np.array([[0,0,0],[0,-1,0],[1,0,0]])
            self.hNW = np.array([[1,0,0],[0,-1,0],[0,0,0]])
    
        def fit(self,img):
    
            diff_im = img.copy()
    
            dx=1; dy=1; dd = math.sqrt(2)
    
            for i in range(self.num_iter):
    
                nablaN = cv2.filter2D(diff_im,-1,self.hN)
                nablaS = cv2.filter2D(diff_im,-1,self.hS)
                nablaW = cv2.filter2D(diff_im,-1,self.hW)
                nablaE = cv2.filter2D(diff_im,-1,self.hE)
                nablaNE = cv2.filter2D(diff_im,-1,self.hNE)
                nablaSE = cv2.filter2D(diff_im,-1,self.hSE)
                nablaSW = cv2.filter2D(diff_im,-1,self.hSW)
                nablaNW = cv2.filter2D(diff_im,-1,self.hNW)
    
                cN = 0; cS = 0; cW = 0; cE = 0; cNE = 0; cSE = 0; cSW = 0; cNW = 0
    
                if self.option == 1:
                    cN = np.exp(-(nablaN/self.kappa)**2)
                    cS = np.exp(-(nablaS/self.kappa)**2)
                    cW = np.exp(-(nablaW/self.kappa)**2)
                    cE = np.exp(-(nablaE/self.kappa)**2)
                    cNE = np.exp(-(nablaNE/self.kappa)**2)
                    cSE = np.exp(-(nablaSE/self.kappa)**2)
                    cSW = np.exp(-(nablaSW/self.kappa)**2)
                    cNW = np.exp(-(nablaNW/self.kappa)**2)
                elif self.option == 2:
                    cN = 1/(1+(nablaN/self.kappa)**2)
                    cS = 1/(1+(nablaS/self.kappa)**2)
                    cW = 1/(1+(nablaW/self.kappa)**2)
                    cE = 1/(1+(nablaE/self.kappa)**2)
                    cNE = 1/(1+(nablaNE/self.kappa)**2)
                    cSE = 1/(1+(nablaSE/self.kappa)**2)
                    cSW = 1/(1+(nablaSW/self.kappa)**2)
                    cNW = 1/(1+(nablaNW/self.kappa)**2)
    
                diff_im = diff_im + self.delta_t * (
    
                    (1/dy**2)*cN*nablaN +
                    (1/dy**2)*cS*nablaS +
                    (1/dx**2)*cW*nablaW +
                    (1/dx**2)*cE*nablaE +
    
                    (1/dd**2)*cNE*nablaNE +
                    (1/dd**2)*cSE*nablaSE +
                    (1/dd**2)*cSW*nablaSW +
                    (1/dd**2)*cNW*nablaNW
                )
    
            return diff_im
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    【解决方案4】:

    各向异性扩散自 2013 年起在 medpy package 中可用

    import numpy as np
    from medpy.filter.smoothing import anisotropic_diffusion
    
    img = np.random.uniform(size=(32,32))
    img_filtered = anisotropic_diffusion(img)
    

    【讨论】:

    • medpy 现在似乎支持 Python 3。 Git 项目页面甚至说不再支持 Python 2。
    猜你喜欢
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 2018-04-17
    • 1970-01-01
    相关资源
    最近更新 更多