def readBmp(filename): image = [common.init_space(480, 640) for x in range(3)] with open(filename, 'rb') as fd: header = fd.read(54) for y in range(479, -1, -1): row = list(bytearray(fd.read(640 * 3))) for x in range(640): index = x * 3 image[2][y][x] = row[index + 0] image[1][y][x] = row[index + 1] image[0][y][x] = row[index + 2] return image
def detect_circles(image): # PUT YOUR CODE HERE # access the image using "image[chanel][y][x]" # where 0 <= y < common.constants.WIDTH and 0 <= x < common.constants.HEIGHT # to create an auxiliar bidimentional structure # you can use "space=common.init_space(heigh, width)" numCircles = 0 radius = 30.0 radiusSquared = 30.0 * 30.0 newImage = common.init_space(480, 640) hough = common.init_space(480, 640) # make edge detection greyscale image newImage, maxGradient = sobel(image, newImage) # normalize the image for y in range(common.constants.HEIGHT): for x in range(common.constants.WIDTH): newImage[y][x] = (newImage[y][x] / maxGradient) * 255 # find the circles in hough space for y in range(common.constants.HEIGHT): for x in range(common.constants.WIDTH): if newImage[y][x] == 255: for a in range(640): if (x - a)**2 < radiusSquared: b = float(y) - math.sqrt(radiusSquared - float((x - a)**2)) if 0.0 < b and b < 480.0: hough[int(b)][a] += 1 # find number of circles for y in range(480): for x in range(640): if hough[y][x] > 32: numCircles += 1 return numCircles
def detect_circles(image): # PUT YOUR CODE HERE # access the image using "image[chanel][y][x]" # where 0 <= y < common.constants.WIDTH and 0 <= x < common.constants.HEIGHT # to create an auxiliar bidimentional structure # you can use "space=common.init_space(heigh, width)" #Sobel edge detection... edge_img = common.init_space(common.constants.HEIGHT, common.constants.WIDTH) for y in range(1, common.constants.HEIGHT - 1): for x in range(1, common.constants.WIDTH - 1): edge_img[y][x] = abs(sobel_x(image, y, x)) + abs( sobel_y(image, y, x)) space = common.init_space(common.constants.HEIGHT, common.constants.WIDTH) for y in range(common.constants.HEIGHT): for x in range(common.constants.WIDTH): val = edge_img[y][x] if val != 0: for yc in range(y - 30, y + 31): for xc in range(x - 30, x + 31): if xc < common.constants.WIDTH and xc >= 0 and yc < common.constants.HEIGHT and yc >= 0: rad = (y - yc)**2 + (x - xc)**2 if rad <= 908 and rad >= 892: space[yc][xc] += 1 maxval = 0 count = 0 for y in range(common.constants.HEIGHT): for x in range(common.constants.WIDTH): val = space[y][x] if val > maxval: count = 1 maxval = val elif val == maxval: count += 1 return count
def detect_circles(image): r = 30 votes = common.init_space(common.constants.HEIGHT, common.constants.WIDTH) for y in range(common.constants.HEIGHT): for x in range(common.constants.WIDTH): pixel = (image[0][y][x], image[1][y][x], image[2][y][x]) if background(y, x, image) == False: neighbouring_pixels = [ (image[0][y][x - 1], image[1][y][x - 1], image[2][y][x - 1]), (image[0][y][x + 1], image[1][y][x + 1], image[2][y][x + 1]), (image[0][y - 1][x], image[1][y - 1][x], image[2][y - 1][x]), (image[0][y + 1][x], image[1][y + 1][x], image[2][y + 1][x]), (image[0][y - 1][x - 1], image[1][y - 1][x - 1], image[2][y - 1][x - 1]), (image[0][y + 1][x + 1], image[1][y + 1][x + 1], image[2][y + 1][x + 1]), (image[0][y - 1][x - 1], image[1][y - 1][x - 1], image[2][y - 1][x - 1]), (image[0][y + 1][x + 1], image[1][y + 1][x + 1], image[2][y + 1][x + 1]) ] if (255, 255, 255) in neighbouring_pixels: for i in range(y - r, y + r): for j in range(x - r, x + r): if background(i, j, image) == False and ( (y - i) * (y - i) + (x - j) * (x - j) == 900): votes[i][j] = votes[i][j] + 1 # print("test") max_votes = votes[0][0] for y in range(common.constants.HEIGHT): for x in range(common.constants.WIDTH): if votes[y][x] > max_votes: max_votes = votes[y][x] count = 0 for rows in votes: for value in rows: if value == max_votes: count = count + 1 return count
def detect_slope_intercept(image): # PUT YOUR CODE HERE # access the image using "image[chanel][y][x]" # where 0 <= y < common.constants.WIDTH and 0 <= x < common.constants.HEIGHT # set line.m and line.b # to create an auxiliar bidimentional structure # you can use "space=common.init_space(heigh, width)" line = common.Line() bmin = -1000 bmax = 1000 mmin = -10 mmax = 10 #line_space = {} space = common.init_space(2000, 2000) bestm = 0 bestb = 0 maxval = 0 for y in range(common.constants.HEIGHT): for x in range(common.constants.WIDTH): r = image[0][y][x] g = image[1][y][x] b = image[2][y][x] if r == 0 and g == 0 and b == 0: # black pixel # find feasible lines #b = y - m*x for m in range(2000): mval = (m - 1000) * 0.01 b = y - mval * x if b >= bmin and b <= bmax: b = int(b) space[m][b] += 1 if space[m][b] >= maxval: bestb = b bestm = mval maxval = space[m][b] # find the highest voted line line.m = bestm line.b = bestb return line
def detect_slope_intercept(image): # PUT YOUR CODE HERE # access the image using "image[chanel][y][x]" # where 0 <= y < common.constants.WIDTH and 0 <= x < common.constants.HEIGHT # set line.m and line.b # to create an auxiliar bidimentional structure # you can use "space=common.init_space(heigh, width)" line = common.Line() hough = common.init_space(2000, 2000) # go over image for y in range(common.constants.HEIGHT): for x in range(common.constants.WIDTH): if ((image[0][y][x] == 0) and (image[1][y][x] == 0) and (image[2][y][x] == 0)): for m_graph in range(0, 2000): m = float(m_graph) / float(100) - 10 b = -(m * x) + y if (b > -1000 and b < 1000): hough[m_graph][int(b) + 1000] += 1 maximum = -1 # find max in hough space for y in range(2000): for x in range(2000): if hough[y][x] > maximum: maximum = hough[y][x] m = float(y) / 100 - 10 b = x - 1000.4 line.m = m line.b = b return line
def detect_normal(image): # PUT YOUR CODE HERE # access the image using "image[chanel][y][x]" # where 0 <= y < common.constants.WIDTH and 0 <= x < common.constants.HEIGHT # set line.theta and line.r # to create an auxiliar bidimentional structure # you can use "space=common.init_space(heigh, width)" line = common.Line() hough = common.init_space(1800, 1800) # go over image for y in range(common.constants.HEIGHT): for x in range(common.constants.WIDTH): if ((image[0][y][x] == 0) and (image[1][y][x] == 0) and (image[2][y][x] == 0)): for theta_graph in range(0, 1800): theta = math.radians(float(theta_graph) / float(10)) r = x * math.cos(theta) - y * math.sin(theta) if (r > -900 and r < 900): hough[theta_graph][int(r) + 900] += 1 maximum = -1 # find max in hough space for y in range(1800): for x in range(1800): if hough[y][x] > maximum: maximum = hough[y][x] theta = math.pi - math.radians(float(y) / float(10)) r = 900 - x line.r = r line.theta = theta return line
def detect_normal(image): # PUT YOUR CODE HERE # access the image using "image[chanel][y][x]" # where 0 <= y < common.constants.WIDTH and 0 <= x < common.constants.HEIGHT # set line.theta and line.r # to create an auxiliar bidimentional structure # you can use "space=common.init_space(heigh, width)" line = common.Line() space = common.init_space(1800, 1800) for y in range(common.constants.HEIGHT): for x in range(common.constants.WIDTH): r = image[0][y][x] g = image[1][y][x] b = image[2][y][x] if r == 0 and g == 0 and b == 0: # black pixel for deg in range(1800): R = x * math.cos(deg * math.pi / 1800) + y * math.sin( deg * math.pi / 1800) if R <= 900 and R >= -900: R = int(R) + 900 space[R][deg] += 1 bestR = 0 bestdeg = 0 maxval = 0 for deg in range(1800): for R in range(1800): val = space[R][deg] if val >= maxval: maxval = val bestdeg = deg bestR = R line.r = bestR - 900 line.theta = (bestdeg * math.pi / 1800) return line