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