Почему существует существенная разница в выходном изображении при изменении параметра ddepth для оператора Собеля? - PullRequest
0 голосов
/ 19 января 2019

Я пытался определить края с помощью OpenCV и запутался с параметром ddepth при применении оператора Sobel.Когда ddepth выходного изображения остается таким же, как исходное изображение, которое в данном случае равно CV_8U, я получаю вывод как

enter image description here

для исходного изображения

enter image description here

, но если параметр ddepth оставить равным CV_64F, выходное изображение будет выглядеть как

enter image description here

Не могли бы вы помочь мне понять, что здесь происходит?

import cv2

img = cv2.imread("valve.png", 0)

sobelx3_64 = cv2.Sobel(img, cv2.CV_64F,1,0,ksize=3)

sobelx3_8 = cv2.Sobel(img, -1,1,0,ksize=3)

cv2.imshow("sobelx3_64", sobelx3_64)

cv2.imshow("sobelx3_8", sobelx3_8)

cv2.waitKey(0)

cv2.destroyAllWindows()

1 Ответ

0 голосов
/ 19 января 2019

Есть две причины для разницы:

  • Во-первых, дисплей. В imshow Opencv будут учитываться только значения между (0,1) для изображений с плавающей точкой и (0,255) для изображений с типом uint8. Любые значения больше 1 будут рассматриваться как 1 для плавающих изображений. Вот почему вы видите, что большинство изображений становятся белыми. Вы можете исправить это с помощью cv2.imshow("sobelx3_64", sobelx3_64/255), т.е. нормализовать его в пределах (0,1) (но посмотрите на второй пункт, это не совсем правильно).
  • print(sobelx3_8[0:3,0:3]);print(sobelx3_64[0:3,0:3]). Это производит следующее. Теперь они отличаются из-за диапазона, фактическое значение оператора sobel больше 255, но тип uint8 не может уместиться в 480, поэтому opencv насытит его до 255. Аналогично для отрицательных значений.

Выход.

[[  0 200 255]
 [  0 131 255]
 [  0   0 255]]
[[   0.  200.  480.]
 [   0.  131.  425.]
 [   0.   -4.  316.]]
...