Как применить cvsobel + 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-битную глубину и заставить функцию работать..


person user671805    schedule 11.11.2011    source источник


Ответы (3)


Что ж, у EMGU на самом деле есть реализации sobel и canny на C#:

 //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>.

Ваше здоровье,

Крис

person Chris    schedule 11.11.2011
comment
Привет, Крис! Большое спасибо... Я пытаюсь найти горизонтальные и вертикальные линии на изображении, так что не могли бы вы помочь мне, сказав, правильно ли использовать операторы sobel? - person user671805; 11.11.2011
comment
Честно говоря, Canny более эффективен в обнаружении краев, однако, в отличие от Sobel, вы не можете определить, в каком направлении двигаться. Я бы предложил использовать Canny, а затем использовать операцию HoughLines, чтобы определить, какие линии являются сильными вертикальными и горизонтальными линиями, вы можете выбрать угол, играя с переменными. Причина в том, что даже если вы использовали sobel, вам все равно нужно найти эти линии на изображении. Если вы застряли, не стесняйтесь спрашивать, и я постараюсь ответить на любой вопрос. - person Chris; 11.11.2011

Определите SobelHoriz как

Image<Gray, short>

, или как называется 16-битное целое число в C#. Затем используйте функцию image.convertTo(), чтобы вернуть его в серый цвет:

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

Я не знаю, как вы это называете на С#. В С++ объект изображения имеет член convertTo().

person Sam    schedule 11.11.2011
comment
не работает, потому что мне нужно знать размер SobelHoriz для инициализации... - person user671805; 11.11.2011
comment
Все, что вам нужно сделать, это изменить Byte на Short в вашем определении sobelHorizontal. И убедитесь, что вы знаете основы программирования на C#, прежде чем приступать к такому сложному проекту. - person Sam; 11.11.2011
comment
Image<Gray, short> = new Image<Gray , short> ( grayImage.Size ) выдает ту же ошибку на sobel ...... Однако решение Криса мне помогло ... Большое спасибо - person user671805; 11.11.2011

Вы также можете установить его напрямую.

Пример:

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>();
person V1NNY    schedule 27.07.2016