四步相位解包裹C#实现

如果前后两个数据之差大于默认值(一般为π,也可自己在调用函数时设定),那么就把第二个值加上或者减去2π,反正最终结果是它俩之差小于默认值即可。【特别注意】这个函数并不是把[-π,π]范围的数据变成[0,2π]的数据,感觉有点类似于让数据具有一定的单调性。

2.5W长度数组执行16ms: 

        /// 
        /// 解相位
        /// 
        /// 数据源
        /// 默认以列进行解包裹
        /// 
        public double[,] unwrap(double[,] data_in,bool col=true)
        {

            double[,] data_out = new double[data_in.GetLength(0),data_in.GetLength(1)];
            bool cen = true;
            double Pi2 = 2 * Math.PI;
            if (col)
            {
                for (int i = 0; i < data_out.GetLength(1); ++i)
                {
                    data_out[0, i] = data_in[0, i];
                    if (((data_in[1, i] > data_in[0, i]) && ((data_in[1, i] - data_in[0, i]) < Math.PI)) || ((data_in[1, i] - data_in[0, i]) < -Math.PI))
                    {
                        cen = true;//+
                    }
                    else
                    {
                        cen = false;//-
                    }

                    double tt1 = 0;
                    if (cen)//+
                    {
                        for (int j = 1; j < data_out.GetLength(0); j++)
                        {
                            if (Math.Abs(data_in[j, i] - data_out[j - 1, i]) < Math.PI)
                                data_out[j, i] = data_in[j - 1, i];
                            else
                            {
                                data_out[j, i] = data_in[j, i] + Pi2;
                                tt1 = Math.Abs(data_out[j, i] - data_out[j - 1, i]);
                                if (tt1 > Math.PI)
                                {
                                    data_out[j, i] = data_out[j, i] - ((int)((tt1 - Math.PI) / Pi2) + 1) * Pi2;
                                }
                            }
                        }
                    }
                    else //-
                    {
                        for (int j = 1; j < data_in.GetLength(0); j++)
                        {
                            if (Math.Abs(data_in[j, i] - data_out[j - 1, i]) < Math.PI)
                                data_out[j, i] = data_in[j - 1, i];
                            else
                            {
                                data_out[j, i] = data_in[j, i] - Pi2;
                                tt1 = Math.Abs(data_out[j, i] - data_out[j - 1, i]);
                                if (tt1 > Math.PI)
                                {
                                    data_out[j, i] = data_out[j, i] - ((int)((tt1 - Math.PI) / Pi2) + 1) * Pi2;
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                for (int i = 0; i < data_out.GetLength(0); ++i)
                {
                    data_out[i,0] = data_in[i,0];
                    if (((data_in[i,1] > data_in[i,0]) && ((data_in[i,1] - data_in[i,0]) < Math.PI)) || ((data_in[i,1] - data_in[i,0]) < -Math.PI))
                    {
                        cen = true;//+
                    }
                    else
                    {
                        cen = false;//-
                    }

                    double tt1 = 0;
                    if (cen)//+
                    {
                        for (int j = 1; j < data_out.GetLength(1); j++)
                        {
                            if (Math.Abs(data_in[i,j] - data_out[i,j-1]) < Math.PI)
                                data_out[i,j] = data_in[i,j-1];
                            else
                            {
                                data_out[i,j] = data_in[i,j] + Pi2;
                                tt1 = Math.Abs(data_out[i,j] - data_out[i,j-1]);
                                if (tt1 > Math.PI)
                                {
                                    data_out[i,j] = data_out[i,j] - ((int)((tt1 - Math.PI) / Pi2) + 1) * Pi2;
                                }
                            }
                        }
                    }
                    else //-
                    {
                        for (int j = 1; j < data_in.GetLength(1); j++)
                        {
                            if (Math.Abs(data_in[i,j] - data_out[i,j-1]) < Math.PI)
                                data_out[i,j] = data_in[i,j-1];
                            else
                            {
                                data_out[i,j] = data_in[i,j] - Pi2;
                                tt1 = Math.Abs(data_out[i,j] - data_out[i,j-1]);
                                if (tt1 > Math.PI)
                                {
                                    data_out[i,j] = data_out[i,j] - ((int)((tt1 - Math.PI) / Pi2) + 1) * Pi2;
                                }
                            }
                        }
                    }
                }
            }
            return data_out;
        }

使用网上下载素材,解包裹样例 

 四步相位解包裹C#实现_第1张图片

 不同频率下的正弦光拍摄到的倾斜长方体:四步相位解包裹C#实现_第2张图片

 四步相位解包裹C#实现_第3张图片

光照不到的地方,形成的阴影会导致一些地方解包裹错误,如上图中的条纹。

实验结果不仅有干涉条纹,还有误差条纹:

四步相位解包裹C#实现_第4张图片

 

后续会继续更新3频4相结果

如果我的文章对您有帮忙,点个赞是对我最大的赞赏  :)

 

 

你可能感兴趣的:(算法设计,解相位,三维重建,c#)