首页 > 解决方案 > python np数组在opencv / opencvsharp中等效

问题描述

我正在尝试将以下 python def 'preproc_img' 转换为等效的 opencvsharp

def compute_norm_mat(base_width, base_height): 
    # normalization matrix used in image pre-processing 
    x      = np.arange(base_width)
    y      = np.arange(base_height)
    X, Y   = np.meshgrid(x, y)
    X      = X.flatten()
    Y      = Y.flatten() 
    A      = np.array([X*0+1, X, Y]).T 
    A_pinv = np.linalg.pinv(A)
    return A, A_pinv

def preproc_img(img, A, A_pinv):
    # compute image histogram 
    img_flat = img.flatten()
    img_hist = np.bincount(img_flat, minlength = 256)

    # cumulative distribution function 
    cdf = img_hist.cumsum() 
    cdf = cdf * (2.0 / cdf[-1]) - 1.0 # normalize 

    # histogram equalization 
    img_eq = cdf[img_flat] 

    diff = img_eq - np.dot(A, np.dot(A_pinv, img_eq))

    # after plane fitting, the mean of diff is already 0 
    std = np.sqrt(np.dot(diff,diff)/diff.size)
    if std > 1e-6: 
        diff = diff/std
    return diff.reshape(img.shape)

在 opencv 或 opencvsharp 中对应的对象是什么?A 和 A_pinv 使用 compute_norm_mat 计算。

我被困在:

private void preproc_img(Mat faceMat)
{
     Cv2.EqualizeHist(faceMat, faceMat);         
}

标签: pythonopencv

解决方案


我不确定这是否正确,但这是我的第一次尝试。

    private Mat preproc_img(Mat faceMat)
    {


        MatOfFloat hist = new MatOfFloat();
        Cv2.CalcHist(new[] { faceMat }, new[] { 0 }, null, hist, 1, new[] { 256 }, new float[][] { new float[] { 0, 256 } });

        Mat cdf = cumsum(hist);
        cdf = cdf * (2.0 / cdf.At<float>(cdf.Rows - 1, 0)) - 1.0; // normalize 



        var cdfidx = cdf.GetGenericIndexer<float>();

        Mat img_eq = EqualizeHist(faceMat, cdfidx);            
        Mat diff = (img_eq.Reshape(0, 64 * 64) - (A * (A_pinv * img_eq.Reshape(0, 64 * 64))));

        var std = Math.Sqrt(diff.Dot(diff) / 64 / 64);

        if (std > 1e-6)
            diff = diff / std;

        return diff.Reshape(0, 64);

    }

    private static Mat EqualizeHist(Mat faceMat, Mat.Indexer<float> cdfidx)
    {
        var img_eq = new Mat();
        faceMat.ConvertTo(img_eq, MatType.CV_32FC1);
        var idx = img_eq.GetGenericIndexer<float>();

        for (var r = 0; r < img_eq.Rows; r++)
        {
            for (var c = 0; c < img_eq.Cols; c++)
            {
                idx[r, c] = cdfidx[(int)idx[r, c], 0];

            }

        }

        return img_eq;
    }

    private static MatOfFloat cumsum(MatOfFloat hist)
    {
        var cdf = hist.Clone();
        var indexer = cdf.GetIndexer();
        var cumsum = 0.0f;


        for (var i = 0; i < hist.Rows; i++)
        {

            cumsum += indexer[i, 0];
            indexer[i,0] = cumsum;
        }

        return cdf;
    }

    public void initializeA()
    {

        MatOfInt X = new MatOfInt();
        MatOfInt Y = new MatOfInt();

        meshgrid(new MatOfInt(new int[] {1,64 },Enumerable.Range(0,64).ToArray()), new MatOfInt(new int[] { 1, 64 }, Enumerable.Range(0, 64).ToArray()), X, Y);



        X = X.Reshape(1);
        Y = Y.Reshape(1);
        Console.WriteLine(X);
        Console.WriteLine(Y);

        A = new Mat();
        A.PushBack(Mat.Ones(1, X.Cols,MatType.CV_32SC1));
        A.PushBack(X);
        A.PushBack(Y);
        A = A.T();
        A_pinv = A.Clone();
        A.ConvertTo(A, MatType.CV_32FC1);
        Cv2.Invert(A, A_pinv,DecompTypes.SVD);

    }

推荐阅读