2015-08-14 5 views
1

Я использую оператор sobel для обнаружения краев в изображении в градациях серого с помощью EmguCV 3.0 (.NET Wrapper для OpenCV).OpenCV: Sobel фильтр не вращается инвариант

кода я использую

Image<Gray, byte> gray = new Image<Gray, byte>(@"C:\gray.bmp"); 
Image<Gray, float> sobel = gray.Sobel(0, 1, 3).Add(gray.Sobel(1, 0, 3)).AbsDiff(new Gray(0.0)); 

Это препроцессированное изображение (серое)

И это то, что я выберусь (Собел)

Как вы можете видеть, края в правом верхнем и нижнем левом углу очень слабы. Сначала я подумал, что это могло бы иметь какое-то отношение к исходному изображению, поэтому я повернул его на 180 градусов и снова запустил фильтр. Результат по-прежнему имеет очень слабые края в правом верхнем и нижнем левом углу (к сожалению, мне не разрешено размещать здесь более двух ссылок, поэтому я не могу показать это вам).

Так что мой вопрос: это ошибка, или я использую фильтр sobel неправильно? Должна ли она быть инвариантной по отношению к вращению, когда она проходила в двух измерениях? И как я могу это исправить, чтобы увидеть эти два края так же сильно, как другие?

+0

Оператор sobel-оператора, нанесенный на повернутое изображение: http://i.stack.imgur.com/U7QCF.jpg (все еще слабый края в правом верхнем и нижнем левом углу) – derjan

+0

Почему бы не создать собственный фильтр? http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/filter_2d/filter_2d.html – William

ответ

1

Я извиняюсь, я уже нашел решение: Теперь код я использую:

Image<Gray, float> sobel = 
    gray.Sobel(1, 0, 3).AbsDiff(new Gray(0.0)) 
     .Add(gray.Sobel(0, 1, 3).AbsDiff(new Gray(0.0))); 

Это приближает норму | GXY | = | Gx | + | Gy |, и в результате получается хорошее изображение с красивыми чистыми краями: http://i.stack.imgur.com/COJSG.png