import
numpy as np
import
os
import
cv2
import
matplotlib.pyplot as plt
def
Canny_detector(img, weak_th
=
None
, strong_th
=
None
):
img
=
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img
=
cv2.GaussianBlur(img, (
5
,
5
),
1.4
)
gx
=
cv2.Sobel(np.float32(img), cv2.CV_64F,
1
,
0
,
3
)
gy
=
cv2.Sobel(np.float32(img), cv2.CV_64F,
0
,
1
,
3
)
mag, ang
=
cv2.cartToPolar(gx, gy, angleInDegrees
=
True
)
mag_max
=
np.
max
(mag)
if
not
weak_th:weak_th
=
mag_max
*
0.1
if
not
strong_th:strong_th
=
mag_max
*
0.5
height, width
=
img.shape
for
i_x
in
range
(width):
for
i_y
in
range
(height):
grad_ang
=
ang[i_y, i_x]
grad_ang
=
abs
(grad_ang
-
180
)
if
abs
(grad_ang)>
180
else
abs
(grad_ang)
if
grad_ang<
=
22.5
:
neighb_1_x, neighb_1_y
=
i_x
-
1
, i_y
neighb_2_x, neighb_2_y
=
i_x
+
1
, i_y
elif
grad_ang>
22.5
and
grad_ang<
=
(
22.5
+
45
):
neighb_1_x, neighb_1_y
=
i_x
-
1
, i_y
-
1
neighb_2_x, neighb_2_y
=
i_x
+
1
, i_y
+
1
elif
grad_ang>(
22.5
+
45
)
and
grad_ang<
=
(
22.5
+
90
):
neighb_1_x, neighb_1_y
=
i_x, i_y
-
1
neighb_2_x, neighb_2_y
=
i_x, i_y
+
1
elif
grad_ang>(
22.5
+
90
)
and
grad_ang<
=
(
22.5
+
135
):
neighb_1_x, neighb_1_y
=
i_x
-
1
, i_y
+
1
neighb_2_x, neighb_2_y
=
i_x
+
1
, i_y
-
1
elif
grad_ang>(
22.5
+
135
)
and
grad_ang<
=
(
22.5
+
180
):
neighb_1_x, neighb_1_y
=
i_x
-
1
, i_y
neighb_2_x, neighb_2_y
=
i_x
+
1
, i_y
if
width>neighb_1_x>
=
0
and
height>neighb_1_y>
=
0
:
if
mag[i_y, i_x]<mag[neighb_1_y, neighb_1_x]:
mag[i_y, i_x]
=
0
continue
if
width>neighb_2_x>
=
0
and
height>neighb_2_y>
=
0
:
if
mag[i_y, i_x]<mag[neighb_2_y, neighb_2_x]:
mag[i_y, i_x]
=
0
weak_ids
=
np.zeros_like(img)
strong_ids
=
np.zeros_like(img)
ids
=
np.zeros_like(img)
for
i_x
in
range
(width):
for
i_y
in
range
(height):
grad_mag
=
mag[i_y, i_x]
if
grad_mag<weak_th:
mag[i_y, i_x]
=
0
elif
strong_th>grad_mag>
=
weak_th:
ids[i_y, i_x]
=
1
else
:
ids[i_y, i_x]
=
2
return
mag
frame
=
cv2.imread(
'food.jpeg'
)
canny_img
=
Canny_detector(frame)
plt.figure()
f, plots
=
plt.subplots(
2
,
1
)
plots[
0
].imshow(frame)
plots[
1
].imshow(canny_img)