Emgu 距离变换

函数:
public static void cvDistTransform(
	IntPtr src,
	IntPtr dst,
	DIST_TYPE distanceType,
	int maskSize,
	float[] userMask,
	IntPtr labels
)

应用:

  private void distanceTransform(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild != null)
            {
                imgForm curWid = (imgForm)this.ActiveMdiChild;                
                Image<Emgu.CV.Structure.Bgr, byte> img = curWid.CurImage;
                Image<Gray, byte> gray = img.Convert<Gray, byte>();
                CvInvoke.cvCanny(gray, gray, 100, 200, 3);
                for (int i = 0; i < gray.Height; i++)
                {
                    for (int j = 0; j < gray.Width; j++)
                    {
                        gray.Data[i, j, 0] = Convert.ToByte(255 - gray.Data[i, j, 0]);
                    }
                }                    
            Image<Gray, byte> result = new Image<Gray, byte>(gray.Width, gray.Height);          
            CvInvoke.cvDistTransform(gray,result, Emgu.CV.CvEnum.DIST_TYPE.CV_DIST_L1, 3, null, IntPtr.Zero);                  
            CvInvoke.cvShowImage("Test", result);  
            CvInvoke.cvShowImage("binary", gray);         
            }
            
        }

当使用其他距离时,要求目标图像为32位图

IntPtr dst = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(src), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_32F, 1);
CvInvoke.cvDistTransform(src, dst, Emgu.CV.CvEnum.DIST_TYPE.CV_DIST_L2, 5, null, IntPtr.Zero);

效果图:

Emgu 距离变换_第1张图片

PS:

emguCV里边,将特征点赋值为0,非特征点为1,而在matlab里边,则恰好相反。

I=imread('D:\公共图片库\1.jpg');
g=rgb2gray(I);
g=edge(g,'canny');
d=bwdist(g,'euclidean');
subplot(121),imshow(mat2gray(d));
subplot(122),imshow(g);
Emgu 距离变换_第2张图片

你可能感兴趣的:(Emgu 距离变换)