Как применить cvsobel emgucv

#c# #image-processing #opencv #emgucv

#c# #обработка изображений #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-битную глубину и заставить функцию работать..

Ответ №1:

Ну, в 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>.
  

Приветствия,

Крис

Комментарии:

1. Привет, Крис, большое спасибо… Я пытаюсь найти горизонтальные и вертикальные линии на изображении, не могли бы вы помочь мне, сообщив, является ли использование операторов sobel правильным путем?

2. Честно говоря, Canny более эффективен при обнаружении ребер, однако, в отличие от sobel, вы не можете определить, в каком направлении проходить. Я бы предложил использовать Canny, а затем использовать операцию HoughLines, чтобы определить, какие линии являются сильными вертикальными и горизонтальными линиями. Вы можете выбрать угол, играя с переменными. Причина в том, что даже если вы использовали sobel, вам все равно придется находить эти строки в изображении. Если вы застряли, не стесняйтесь спрашивать, и я постараюсь ответить на любой вопрос, приветствия

Ответ №2:

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

 Image<Gray, short>
  

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

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

Я не знаю, как это называется на C #. В c объект image имеет элемент ConvertTo()

Комментарии:

1. не работает, потому что мне нужно знать размер SobelHoriz для инициализации…

2. Все, что вам нужно сделать, это изменить Byte на short в вашем определении sobelHorizontal. И убедитесь, что вы знаете основы программирования на C #, прежде чем браться за такой сложный проект.

3. Image<Gray, short> = new Image<Gray , short> ( grayImage.Size ) выдает мне ту же ошибку на sobel…… Однако решение Криса помогло мне… Большое спасибо

Ответ №3:

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

Пример:

 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>();