1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
#!/usr/bin/env python3
from cv2 import (
COLOR_BGR2GRAY, KMEANS_RANDOM_CENTERS, THRESH_BINARY, TERM_CRITERIA_EPS,
TERM_CRITERIA_MAX_ITER, Canny as canny, cvtColor as cvt_color,
HoughLines as hough_lines, imread, imshow, inRange as in_range, kmeans,
Laplacian as laplacian, line, Sobel as sobel, threshold,
waitKey as wait_key)
from numpy import cos, float32, pi, sin, uint8
FILENAME = 'dino-gang.jpg'
THRESHOLD, WHITE = 128, 255
CANNY_THRESH = 69
def disp(image, name):
"""Display the given image."""
imshow(name, image.astype(uint8))
wait_key()
image = imread(FILENAME)
disp(image, 'original')
# Exercise 1
# Requiring all three channels to be greater than THRESHOLD
# using in_range produces a blacker result (fewer white points).
# The information inferred by human (me) is less clear.
grey = cvt_color(image, COLOR_BGR2GRAY)
disp(threshold(grey, THRESHOLD, WHITE, THRESH_BINARY)[-1], 'threshold')
disp(in_range(image, (THRESHOLD,)*3, (WHITE,)*3), 'in range')
# Exercise 2
disp(laplacian(image, 2), 'Laplacian')
disp(sobel(image, 2, 1, 1), 'Sobel')
# Canny produces a lot visible edge comparing to Laplacian and Sobel.
edges = canny(image, CANNY_THRESH, CANNY_THRESH*2)
disp(edges, 'canny')
# Exercise 3
pixels = float32(image.reshape((-1, 3)))
criteria = TERM_CRITERIA_EPS|TERM_CRITERIA_MAX_ITER, 10, 1.0
ret, labels, centers = kmeans(pixels, 3, None, criteria,
10, KMEANS_RANDOM_CENTERS)
# Compared to global threshold, this has colors.
# I am unsure how this relate to adaptive threshold though.
disp(centers[labels.flatten()].reshape(image.shape), 'seg')
# Exercise 4
for ((rho, theta),) in hough_lines(edges, 1, pi/180, THRESHOLD):
a, b = cos(theta), sin(theta)
x, y = a*rho, b*rho
line(image, (int(x-b*1000), int(y+a*1000)), (int(x+b*1000), int(y-a*1000)),
(0, 0, 255), 2)
disp(image, 'hough')
|