예제 #1
0
파일: main.py 프로젝트: skyscraperV/cmpt820
def main(quantMat, path):
    #quantMat = np.full([8,8], 1)

    #Read Image
    orgImage = imt.ImageTransform()
    orgRGB = orgImage.readImage(path)

    #Reduce resolution
    imgPIL = orgImage.rgb2img(orgRGB)
    halfImg = imt.ImageTransform.imresize(imgPIL, np.shape(orgRGB), 2)
    quartImg = imt.ImageTransform.imresize(imgPIL, np.shape(orgRGB), 4)
    '''Hierachical Encoding'''
    #Encode quartImg
    F_info_quart, orgShape_quart = coding.encode(np.array(quartImg), quantMat)
    #print orgShape_quart
    #Decode QuartImg
    recRGB_quart, recImg2show_quart = coding.decode(F_info_quart, quantMat,
                                                    orgShape_quart)
    #recImg2show_quart.show()

    #Encode half diff  Image
    hierVar = hr.Hier(quantMat)
    halfdiffF_info, halfdifforgShape, hafldiffrecRGB, halfdiffrecImg2show = hierVar.hierEncode(
        np.array(quartImg), np.array(halfImg))

    #Decode half
    recRGB_halfdiff, recImg2show_halfdiff = coding.decode(
        halfdiffF_info, quantMat, halfdifforgShape)
    fRecoverHalf, fRecoverHalfImg = hierVar.hireDecode(np.array(quartImg),
                                                       recRGB_halfdiff)
    #fRecoverHalfImg.show()
    #fRecover, fRecoverImg = hierVar.hireDecode(fRecoverHalf, diffF_info, difforgShape)

    #Encode whole diff Image
    #imgPIL.show()
    diffF_info, difforgShape, diffrecRGB, diffrecImg2show = hierVar.hierEncode(
        np.array(fRecoverHalfImg), np.array(imgPIL))
    #Decode whole image
    recRGB_diff, recImg2show_diff = coding.decode(diffF_info, quantMat,
                                                  difforgShape)
    fRecover, fRecoverImg = hierVar.hireDecode(np.array(fRecoverHalfImg),
                                               recRGB_diff)
    #fRecoverHalfImg.show()
    #fRecoverImg.show()
    return [
        imgPIL, fRecoverImg, halfdiffrecImg2show, diffrecImg2show,
        fRecoverHalfImg, recImg2show_quart
    ]
예제 #2
0
def detect_markers(img):
    width, height, _ = img.shape
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    edges = cv2.Canny(gray, 10, 100)
    contours, hierarchy = cv2.findContours(edges.copy(), cv2.RETR_TREE,
                                           cv2.CHAIN_APPROX_NONE)[-2:]

    # We only keep the long enough contours
    min_contour_length = min(width, height) / 50
    contours = [
        contour for contour in contours if len(contour) > min_contour_length
    ]
    warped_size = 49
    canonical_marker_coords = array(
        ((0, 0), (warped_size - 1, 0), (warped_size - 1, warped_size - 1),
         (0, warped_size - 1)),
        dtype='float32')

    markers_list = []
    transform_list = []
    for contour in contours:
        approx_curve = cv2.approxPolyDP(contour, len(contour) * 0.01, True)
        if not (len(approx_curve) == 4 and cv2.isContourConvex(approx_curve)):
            continue

        sorted_curve = array(cv2.convexHull(approx_curve, clockwise=False),
                             dtype='float32')
        persp_transf = cv2.getPerspectiveTransform(sorted_curve,
                                                   canonical_marker_coords)
        transform_list.append(persp_transf)
        warped_img = cv2.warpPerspective(img, persp_transf,
                                         (warped_size, warped_size))
        warped_gray = cv2.cvtColor(warped_img, cv2.COLOR_BGR2GRAY)

        _, warped_bin = cv2.threshold(warped_gray, 127, 255, cv2.THRESH_BINARY)
        marker = warped_bin.reshape([
            MARKER_SIZE, warped_size / MARKER_SIZE, MARKER_SIZE,
            warped_size / MARKER_SIZE
        ])
        marker = marker.mean(axis=3).mean(axis=1)
        marker[marker < 127] = 0
        marker[marker >= 127] = 1

        try:
            marker = validate_and_turn(marker)
            hamming_code = extract_hamming_code(marker)
            marker_id = int(decode(hamming_code), 2)
            markers_list.append(
                HammingMarker(id=marker_id, contours=approx_curve))
        except ValueError:
            continue
    return markers_list
예제 #3
0
파일: main.py 프로젝트: CrazyAlan/cmpt820
def main(quantMat, path):
	#quantMat = np.full([8,8], 1)

	#Read Image
	orgImage = imt.ImageTransform()
	orgRGB = orgImage.readImage(path)

	#Reduce resolution
	imgPIL = orgImage.rgb2img(orgRGB)
	halfImg = imt.ImageTransform.imresize(imgPIL, np.shape(orgRGB), 2)
	quartImg = imt.ImageTransform.imresize(imgPIL, np.shape(orgRGB), 4)

	'''Hierachical Encoding'''
	#Encode quartImg
	F_info_quart, orgShape_quart = coding.encode(np.array(quartImg), quantMat)
	#print orgShape_quart
	#Decode QuartImg
	recRGB_quart, recImg2show_quart = coding.decode(F_info_quart, quantMat, orgShape_quart)
	#recImg2show_quart.show()

	#Encode half diff  Image
	hierVar = hr.Hier(quantMat)
	halfdiffF_info, halfdifforgShape, hafldiffrecRGB, halfdiffrecImg2show = hierVar.hierEncode(np.array(quartImg), np.array(halfImg))

	#Decode half 
	recRGB_halfdiff, recImg2show_halfdiff = coding.decode(halfdiffF_info, quantMat, halfdifforgShape)
	fRecoverHalf, fRecoverHalfImg = hierVar.hireDecode(np.array(quartImg), recRGB_halfdiff)
	#fRecoverHalfImg.show()
	#fRecover, fRecoverImg = hierVar.hireDecode(fRecoverHalf, diffF_info, difforgShape)

	#Encode whole diff Image
	#imgPIL.show()
	diffF_info, difforgShape, diffrecRGB, diffrecImg2show = hierVar.hierEncode(np.array(fRecoverHalfImg), np.array(imgPIL))
	#Decode whole image
	recRGB_diff, recImg2show_diff = coding.decode(diffF_info, quantMat, difforgShape)
	fRecover, fRecoverImg = hierVar.hireDecode(np.array(fRecoverHalfImg), recRGB_diff)
	#fRecoverHalfImg.show()
	#fRecoverImg.show()
	return [imgPIL, fRecoverImg, halfdiffrecImg2show ,diffrecImg2show, fRecoverHalfImg ,recImg2show_quart] 
예제 #4
0
	def hierEncode(self, f_half, f):
		highResShape = np.shape(f)
		E_f_half = imt.ImageTransform.imresize(self.IMT.rgb2img(f_half), highResShape, 1)
		E_f_half_RGB = np.array(E_f_half)

		diffRGB = f.astype(int) - E_f_half_RGB.astype(int)
		diffRGB[diffRGB<0] = 1
		diffRGB[diffRGB>255] = 255
		diffRGB = diffRGB.astype(np.uint8)
		F_info, orgShape = coding.encode(np.array(diffRGB), self.quantMat)
		recRGB, recImg2show = coding.decode(F_info, self.quantMat, orgShape)

		return F_info, orgShape, recRGB, recImg2show
예제 #5
0
    def hierEncode(self, f_half, f):
        highResShape = np.shape(f)
        E_f_half = imt.ImageTransform.imresize(self.IMT.rgb2img(f_half),
                                               highResShape, 1)
        E_f_half_RGB = np.array(E_f_half)

        diffRGB = f.astype(int) - E_f_half_RGB.astype(int)
        diffRGB[diffRGB < 0] = 1
        diffRGB[diffRGB > 255] = 255
        diffRGB = diffRGB.astype(np.uint8)
        F_info, orgShape = coding.encode(np.array(diffRGB), self.quantMat)
        recRGB, recImg2show = coding.decode(F_info, self.quantMat, orgShape)

        return F_info, orgShape, recRGB, recImg2show
예제 #6
0
파일: detect.py 프로젝트: petr-devaikin/app
def detect_markers(img):
    width, height, _ = img.shape
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    edges = cv2.Canny(gray, 10, 100)
    contours, hierarchy = cv2.findContours(edges.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

    # We only keep the long enough contours
    min_contour_length = min(width, height) / 50
    contours = [contour for contour in contours if len(contour) > min_contour_length]
    warped_size = 49
    canonical_marker_coords = array(((0, 0),
                                     (warped_size - 1, 0),
                                     (warped_size - 1, warped_size - 1),
                                     (0, warped_size - 1)),
                                    dtype='float32')

    markers_list = []
    for contour in contours:
        approx_curve = cv2.approxPolyDP(contour, len(contour) * 0.01, True)
        if not (len(approx_curve) == 4 and cv2.isContourConvex(approx_curve)):
            continue

        sorted_curve = array(cv2.convexHull(approx_curve, clockwise=False),
                             dtype='float32')
        persp_transf = cv2.getPerspectiveTransform(sorted_curve, canonical_marker_coords)
        warped_img = cv2.warpPerspective(img, persp_transf, (warped_size, warped_size))
        warped_gray = cv2.cvtColor(warped_img, cv2.COLOR_BGR2GRAY)

        _, warped_bin = cv2.threshold(warped_gray, 127, 255, cv2.THRESH_BINARY)
        marker = warped_bin.reshape(
            [MARKER_SIZE, warped_size / MARKER_SIZE, MARKER_SIZE, warped_size / MARKER_SIZE]
        )
        marker = marker.mean(axis=3).mean(axis=1)
        marker[marker < 127] = 0
        marker[marker >= 127] = 1

        try:
            marker = validate_and_turn(marker)
            hamming_code = extract_hamming_code(marker)
            marker_id = int(decode(hamming_code), 2)
            markers_list.append(HammingMarker(id=marker_id, contours=approx_curve))
        except ValueError:
            continue
    return markers_list
예제 #7
0
def evaluate(net, loader, thres=0.5, max_aabbs=None):
    batch_imgs = []
    batch_aabbs = []
    loss = 0

    for i in range(len(loader)):
        # get batch
        loader_item = loader[i]
        with torch.no_grad():
            y = net(loader_item.batch_imgs, apply_softmax=True)
            y_np = y.to('cpu').numpy()
            if loader_item.batch_gt_maps is not None:
                loss += compute_loss(
                    y, loader_item.batch_gt_maps).to('cpu').numpy()

        scale_up = 1 / compute_scale_down(WordDetectorNet.input_size,
                                          WordDetectorNet.output_size)
        metrics = BinaryClassificationMetrics(0, 0, 0)
        for i in range(len(y_np)):
            img_np = loader_item.batch_imgs[i, 0].to('cpu').numpy()
            pred_map = y_np[i]

            aabbs = decode(pred_map,
                           comp_fg=fg_by_cc(thres, max_aabbs),
                           f=scale_up)
            h, w = img_np.shape
            aabbs = [aabb.clip(AABB(0, w - 1, 0, h - 1))
                     for aabb in aabbs]  # bounding box must be inside img
            clustered_aabbs = cluster_aabbs(aabbs)

            if loader_item.batch_aabbs is not None:
                curr_metrics = binary_classification_metrics(
                    loader_item.batch_aabbs[i], clustered_aabbs)
                metrics = metrics.accumulate(curr_metrics)

            batch_imgs.append(img_np)
            batch_aabbs.append(clustered_aabbs)

    return EvaluateRes(batch_imgs, batch_aabbs, loss / len(loader), metrics)
예제 #8
0

class DatasetIAMSplit:
    """wrapper which provides a dataset interface for a split of the original dataset"""
    def __init__(self, dataset, start_idx, end_idx):
        assert start_idx >= 0 and end_idx <= len(dataset)

        self.dataset = dataset
        self.start_idx = start_idx
        self.end_idx = end_idx

    def __getitem__(self, idx):
        return self.dataset[self.start_idx + idx]

    def __len__(self):
        return self.end_idx - self.start_idx


if __name__ == '__main__':
    from visualization import visualize
    from coding import encode, decode
    import matplotlib.pyplot as plt

    dataset = DatasetIAM(Path('../data'), (350, 350), (350, 350), caching=False)
    img, gt = dataset[0]
    gt_map = encode(img.shape, gt)
    gt = decode(gt_map)

    plt.imshow(visualize(img / 255 - 0.5, gt))
    plt.show()
예제 #9
0
def check(s):
    c = encode(s)
    s2 = decode(c)
    assert '\n' not in c[:-1]
    assert c[-1] == '\n'
    assert s == s2
예제 #10
0
 def on_decode_button_clicked(self):
     method = self.method_chooser.get()
     code = self.code.get('1.0', 'end')[:-1]
     text = coding.decode(method, code)
     self.text.delete('1.0', 'end')
     self.text.insert('1.0', text)
예제 #11
0
def load_line(line):
    return pickle.loads(decode(line))