如何应用cvsobel + emgucv

时间:2011-11-11 12:49:12

标签: c# image-processing opencv emgucv

我在使用cvsobel函数时遇到了一些问题。我已经读过cvsobel将图像深度从8位增加到16位......

有人可以帮我弄清楚如何将它缩放回8位......

我的代码是

Image<Gray, Byte> grayImage = TestImage.Convert<Gray, Byte>().PyrDown().PyrUp(); ;
Image<Gray, Byte> Dest = new Image<Gray, Byte>(grayImage.Size);
Image<Gray, Byte> SobelHorizontal = new Image<Gray, Byte>(grayImage.Size);
CvInvoke.cvCanny(grayImage, Dest, 10, 60, 3);
CvInvoke.cvSobel(Dest, SobelHorizontal, 1, 0, 3); // introduces exception

其中TestImage是我从用户处获取的彩色图像。

我认为问题在于SobelHorizontal的声明......我如何在这里给出16位深度并使函数有效..

3 个答案:

答案 0 :(得分:2)

EMGU实际上在C#中实现了sobel和canny实现:

 //grayImage.Canny(Gray thresh, Gray threshelinking)
 grayImage.Canny(new Gray(10), new Gray(60));
 //grayImage.Sobel(int xorder, intyorder, int aptureSize)
 grayImage.Sobel(1, 0, 3);

这应该按照你的意愿去做,不过你遇到的困难,但是如上所述,你可以声明你喜欢的图像的数据类型

Image<Gray,short> Image<Gray,double>, or Image<Gray,float>.

干杯,

克里斯

答案 1 :(得分:0)

将SobelHoriz定义为

Image<Gray, short>

,或者将whatewer命名为C#中的16位整数。然后使用image.convertTo()函数将其恢复为灰色:

Image<gray, byte> sobelDisplay;
sobelHoriz.convertTo(sobelDisplay);

我不知道你是怎么用C#调用它的。在c ++中,image对象有一个convertTo()成员

答案 2 :(得分:0)

您也可以直接设置它。

示例:

Image<Emgu.CV.Structure.Gray, byte> objImagemTemplate = new Image<Emgu.CV.Structure.Gray, byte>(objBitmapTemplate); // Image A
objImagemTemplate = (objImagemTemplate.Canny(new Gray(10), new Gray(60)).Sobel(1, 0, 1)).Convert<Gray, Byte>();