Я пытаюсь реализовать фильтр Собела с помощью opencv.Тем не менее, не получил ожидаемый край обнаруженного изображения.
Использовал cv2.getDerivKernels (), чтобы получить соответствующие ядра для направления x и y.Затем sepFilter2D () используется для применения ядер для получения производных в направлении x и y отдельно.Затем определяют величину производной и сравнивают с пороговым значением для получения изображения, детектированного по краю.
Производные по осям x и y представлены отдельно, что дало ожидаемые результаты.Но конечный результат не тот, который ожидался.Пожалуйста, ознакомьтесь с кодом, приведенным ниже.
Может быть проблема с пороговым значением, так как я принял его за 200, но также пробовал с меньшими значениями, но все еще не дает хорошего результата.Не уверен, как решить, какой порог взять.
# Kernels for derivatives in x direction
kx1,kx2 = cv2.getDerivKernels(0,1,5)
img_x = cv2.sepFilter2D(image,ddepth=-1,kernelX=kx2,kernelY=kx1)
# Kernels for derivatives in y direction
ky1,ky2 = cv2.getDerivKernels(1,0,5)
img_y = cv2.sepFilter2D(image,ddepth=-1,kernelX=ky1,kernelY=ky2)
# Magnitude
magnitude = np.sqrt((img_x * img_x) + (img_y * img_y))
magnitude *= 255.0/np.max(magnitude)
mag = magnitude.astype("uint8")
# Compare with a threshold value
final_mag = np.zeros(mag.shape,dtype="uint8")
for i in range(mag.shape[0]):
for j in range(mag.shape[1]):
if mag[i,j]<200:
final_mag[i,j] = 0
else:
final_mag[i,j] = 255
cv2.imshow("final_mag",final_mag)