当我在不同的电脑(和显示器)上尝试对同一图像文件执行一些二进制操作时,使用CvInvoke.Canny()
方法时会得到不同的结果。
在调用此方法之前,我使用了几种操纵方法,例如:CvInvoke.Threshold()
,CvInvoke.Erode()
,CvInvoke.Dilate()
等等...... 所有这些的结果始终相等。
只有当我调用:
UMat inputImageUMAT = new Image<Gray, byte>(inputImageBitmap).ToUMat();
UMat imageUmat = new UMat();
CvInvoke.Threshold(imageInputUMAT, imageUmat, threshold, 255,
Emgu.CV.CvEnum.ThresholdType.Binary);
// clear noises with Erode & Dilate:
CvInvoke.Erode(imageUmat, imageUmat, null, new Point(-1, -1), 1,
BorderType.Constant, CvInvoke.MorphologyDefaultBorderValue);
CvInvoke.Dilate(imageUmat, imageUmat, null, new Point(-1, -1), 1,
BorderType.Constant, CvInvoke.MorphologyDefaultBorderValue);
//use image pyr to remove noise:
UMat pyrDown = new UMat();
CvInvoke.PyrDown(imageUmat, pyrDown);
CvInvoke.PyrUp(pyrDown, imageUmat);
// set cannyEdges to hold the outlines of the shapes detected in the image
(according to threshold)
UMat cannyEdges = new UMat();
CvInvoke.Canny(imageUmat, cannyEdges, threshold, threshold);
不同计算机输出总是存在差异。尽管如此,每台计算机始终会给出完全相同的结果-一次又一次。
可能是什么原因导致了这个问题?
我必须在任何地方获得完全相同的结果...
p.s.
我使用C# Nuget:EMGU.CV v3.3.0.2824
编辑:
我拿到了原始文件:original
并跳过了整个过程中的所有操作,并立即执行了 Canny
:
UMat inputImageUMAT = new UMat(fileName, ImreadModes.Grayscale);
UMat cannyEdges = new UMat();
CvInvoke.Canny(imageInputUMAT, cannyEdges, threshold, threshold, 3, true);
cannyEdges.Save(outputFileName);