C# 指针操作图像 求灰度直方图等

版权声明:欢迎转载与留言提问 https://blog.csdn.net/qq_25439417/article/details/82113993
Intptr bmptr = bitmap.scan0;
byte[] bm = new byte[]
Marshal.Copy(bmptr,bm,0,bmlength);

以上是获取图像的位图的指针与字节数组对象的伪代码

之后对BM即图像数组进行操作即可。

在我的项目中,采集图像与显示和二值化方法如下所示

IntPtr pBufferMono = IntPtr.Zero;
                        if (__IsPixelFormat8(objIBaseData.GetPixelFormat()))
                        {
                            pBufferMono = objIBaseData.GetBuffer();
                        }
                        else
                        {
                            pBufferMono = objIBaseData.ConvertToRaw8(emValidBits);
                        }
                        int len =  __GetStride(m_nWidth, m_bIsColor) * m_nHeigh;
                        Marshal.Copy(pBufferMono, m_byMonoBuffer, 0, len);
                        Console.WriteLine(len);
                        int max = 0;
                        int maxindex = 0;
                        int min = len;
                        int minindex = 0;
                        int[] huidutu = new int[256];
                        for (int i = 0; i < len; i++) {
                            int gray = m_byMonoBuffer[i];
                            //Console.WriteLine(gray);
                            huidutu[gray]++;
                        }

                        for (int i = 0; i < 255; i++) {
                            if (huidutu[i] > max )
                            {
                                max = huidutu[i];
                                maxindex = i;
                            }   
                        }
                        for (int i = 0; i < 255; i++)
                        {
                            if (huidutu[i] < min)
                            {
                                min = huidutu[i];
                                minindex= i;
                            }
                        }
                       
                        
                        Console.WriteLine("结束了一波:最小灰度:"+min+" 最小灰度index:"+minindex+":最大灰度:"+max+" 最大灰度index:"+maxindex);
                        //minindex -->灰度阈值  做二值化分割
                        for (int i = 0; i < len; i++)
                        {
                            if (m_byMonoBuffer[i] < minindex)
                            {
                                m_byMonoBuffer[i] = 0;
                            }
                            else
                            {
                                m_byMonoBuffer[i] = 255;
                            }

                        }

完全版,做了初始化 瞳孔区域观测,与后期固定区域探测

  //初始化 瞳孔范围
        int leftwidth = 0;
        int rightwidth = 0;
        int upheight = 0;
        int downheight = 0;
        int initnum = 0;
        int range = 0;
        Boolean inithuiduflag = false;
        Boolean initpointflag = false;
        
        /// <summary>
        /// 用于显示图像
        /// </summary>
        /// <param name="objIBaseData">图像数据对象</param>
  public void Show(IBaseData objIBaseData)
        {
            GX_VALID_BIT_LIST emValidBits = GX_VALID_BIT_LIST.GX_BIT_0_7;

            //检查图像是否改变并更新Buffer
            __UpdateBufferSize(objIBaseData);


            if (null != objIBaseData)
            {
                emValidBits = __GetBestValudBit(objIBaseData.GetPixelFormat());
                if (GX_FRAME_STATUS_LIST.GX_FRAME_STATUS_SUCCESS == objIBaseData.GetStatus())
                {
                    if (m_bIsColor)
                    {
                        IntPtr pBufferColor = objIBaseData.ConvertToRGB24(emValidBits, GX_BAYER_CONVERT_TYPE_LIST.GX_RAW2RGB_NEIGHBOUR, false);
                        Marshal.Copy(pBufferColor, m_byColorBuffer, 0, __GetStride(m_nWidth, m_bIsColor) * m_nHeigh);
                        __ShowImage(m_byColorBuffer);
                    }
                    else
                    {
                        IntPtr pBufferMono = IntPtr.Zero;
                        if (__IsPixelFormat8(objIBaseData.GetPixelFormat()))
                        {
                            pBufferMono = objIBaseData.GetBuffer();
                        }
                        else
                        {
                            pBufferMono = objIBaseData.ConvertToRaw8(emValidBits);
                        }
                        int len =  __GetStride(m_nWidth, m_bIsColor) * m_nHeigh;
                        Marshal.Copy(pBufferMono, m_byMonoBuffer, 0, len);

                        int max = 0;
                        int maxindex = 0;
                        int min = len;
                        int minindex = 0;

                        //Console.WriteLine(len);
                        //如果第一次初始化,那么求得minindex,找到波谷做分割,后面则不再做此操作
                        if (inithuiduflag == false && initpointflag == false)
                        {
                            int[] huidutu = new int[256];
                            for (int i = 0; i < len; i++)
                            {
                                int gray = m_byMonoBuffer[i];
                                //Console.WriteLine(gray);
                                huidutu[gray]++;
                            }
                            for (int i = 0; i < 100; i++)
                            {
                                if (huidutu[i] > max)
                                {
                                    max = huidutu[i];
                                    maxindex = i;
                                }
                            }
                            for (int i = 0; i < maxindex; i++)
                            {
                                if (huidutu[i] < min)
                                {
                                    min = huidutu[i];
                                    minindex = i;
                                }
                            }
                           
                        }
                        
                        //minindex -->灰度阈值  做二值化分割
                        int whitenum = 0;
                        int xsum = 0;
                        int ysum = 0;
                        if (inithuiduflag == true) {
                            len = downheight * m_nWidth + leftwidth + 2 * range;
                        }

                        Console.WriteLine("结束了一波:最小灰度:" + min + " 最小灰度index:" + minindex + ":最大灰度:" + max + " 最大灰度index:" + maxindex+" 长度:"+len);
                        for (int i = upheight*m_nWidth+leftwidth; i < len; i++)
                        {
                            //小于阈值的部分,置为1,让其成为白色,置为1的目的是为了更好的做 图像质点 求取,因为瞳孔部分少,所以1更少,从1求质心计算量小
                            if (m_byMonoBuffer[i] <= minindex)
                            {
                                m_byMonoBuffer[i] = 1;
                                whitenum++;
                                //图像是 m_nHeigh* m_nWidth
                                xsum = xsum + i % m_nWidth;
                                ysum = ysum + i / m_nWidth;
                            }

                            //小于阈值的部分,置为0,让其成为黑色,置为0的目的是为了更好的做 图像质点 求取
                            else
                            {
                                m_byMonoBuffer[i] = 0;
                            }
                        }
                        ArrayList pointlist = new ArrayList();
                        int[] pointindex = new int[2];
                        pointindex[0] = xsum / whitenum;
                        pointindex[1] = ysum / whitenum;
                        //初始化 下一次检测区域
                        if (initpointflag == false)
                        {
                            range = 100;
                            leftwidth = pointindex[0] - range;
                            rightwidth = pointindex[0] + range;

                            upheight = pointindex[1] - range;
                            downheight = pointindex[1] + range;
                            if (leftwidth < 0)
                                leftwidth = 0;
                            if(rightwidth>m_nWidth)
                                rightwidth=m_nWidth;
                            if (upheight < 0)
                                upheight = 0;
                            if (downheight > m_nHeigh)
                                downheight = m_nHeigh;
                            //如果初始化成功
                            initpointflag = true;
                            
                            inithuiduflag = true;
                            Console.WriteLine("init succ");
                        }

                        pointlist.Add(pointindex);
                        __ShowImage(m_byMonoBuffer);

                    }
                }
            }
        }

猜你喜欢

转载自blog.csdn.net/qq_25439417/article/details/82113993
今日推荐