函数: 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);效果图:
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);