代码之家  ›  专栏  ›  技术社区  ›  Poul K. Sørensen

opencv/opencvsharp中的python np数组等价性

  •  0
  • Poul K. Sørensen  · 技术社区  · 6 年前

    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)
    

    我被困在:

    private void preproc_img(Mat faceMat)
    {
         Cv2.EqualizeHist(faceMat, faceMat);         
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Poul K. Sørensen    6 年前

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

        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);
    
        }