2014-11-08 42 views
0

我有一個用C編寫的降噪算法,我需要使用weave.inline來執行代碼以消除圖像中的噪聲。該算法無法正常工作。它表示編織工作在一維數組上,所以這就是爲什麼我必須將二維數組轉換爲一維數組。這就是我所做的,但是當我將一個一維數組發送到C算法中時,似乎我只返回零,取決於迭代的次數,或者我得到的東西與我發送的1D完全相同。 (但是當我平等測試,如果他們是相同的,它認爲他們不是)。任何人都可以看到我的算法有什麼問題?下面是代碼:如何使用編織來執行c代碼圖像去噪算法?

#!/usr/bin/env python 
from PIL import Image 
import numpy as np 
from scipy.weave import inline 
from scipy.weave import converters 

def weave_iso_difusion_denoising(data0, m, n, kappa, iters): 
    """ 
    Function of removing noise from pictures 
    """ 

    c_code = r""" 
    // Fill top and bottom edge 
    for (int i=0; i<m; i++) 
    { 
     data1[m*i*0] = data0[m*i*0]; 
     data1[i*(n-1)] = data0[i*(n-1)]; 
    } 

    // Fill left and right edges 
    for (int i=1; i<n-1; i++) // skip corners 
    { 
     data1[n*0*i] = data0[n*0*i]; 
     data1[(n-1)*i] = data0[(n-1)*i]; 
    } 

    for (int iter=0; iter<iters; iter++) 
    { 
     // Fill interior 
     for (int i=1; i<m-1; i++) 
     { 
      for (int j=1; j<n-1; j++) 
      { 
       data1[n*i+j] = data0[n*i+j] +kappa*(data0[n*(i-1)+j] 
         +data0[n*i+(j-1)] -4*data0[n*i+j] + 
        data0[n*i+(j+1)] + data0[n*(i+1)+j]); 
      } 
     } 
     tmp = data0; 
     data0 = data1; 
     data1 = tmp; 
    } 
    """ 
    data1 = np.zeros(data0.shape, dtype=data0.dtype) 
    data1 = data1.ravel() 
    tmp = np.zeros(data0.shape, dtype=data0.dtype) 
    tmp = tmp.ravel() 
    var = ['data0', 'm', 'n', 'kappa', 'iters','data1','tmp'] 
    inline(c_code,var,type_converters=converters.blitz, compiler='gcc') 
    return data1 

if __name__ == '__main__': 

    # from image-file to Numpy 
    img = Image.open("disaster_before.jpg") # the noisy picture 
    data0 = np.array(img.getdata()) # 1D-array 
    print 'data0:',data0 

    # executing the denoise-program 
    kappa = 0.05; iters = 11; n = 375; m = 500 
    data2 = weave_iso_difusion_denoising(data0, m, n,kappa, iters) 
    print 'data:',data2 

    print 'data2 - data0:',np.sum(abs(data2 - data0)) 

    # from Numpy to image-file 
    img1 = Image.new('L', (m,n)) 
    img1.putdata(data2) 
    img1.save("disaster_after_weave_v1.jpg") 

output 
""" 
data0: [156 181 177 ..., 124 35 90] 
data: [156 181 177 ..., 124 35 90] 
data2 - data0: 18776776 # data0 and data1 is not the same even though they look the same 
""" 
+0

只是'data2 - data0'顯示沒有絕對值和總和? – BlackVegetable 2014-11-08 18:00:01

+0

此外,你是否在數據0的打印和打印兩個數組之間的差異的時間之間突變data0? – BlackVegetable 2014-11-08 18:04:02

回答

0

有了這個保護 - 諮詢熱點

print 'data2 - data0:',np.sum(abs(data2 - data0)) 

你可以測試data0data1是相同的,或者它們是不同的。重點是看看算法是否能完成這項工作。