Example #1
0
def prepare_patient_images(patient_id, intermediate_crop=0):
    file_lst = []
    prefix = str(patient_id).rjust(4, '0')
    src_files = helpers.get_files(settings.BASE_PREPROCESSEDIMAGES_DIR, prefix + "*.png")

    patient_dir = helpers.get_pred_patient_dir(patient_id)
    helpers.create_dir_if_not_exists(patient_dir)
    patient_img_dir = helpers.get_pred_patient_img_dir(patient_id)
    helpers.create_dir_if_not_exists(patient_img_dir)
    helpers.delete_files(patient_img_dir, "*.png")

    dummy = numpy.zeros((settings.TARGET_SIZE, settings.TARGET_SIZE))
    cv2.imwrite(patient_img_dir + "dummy_overlay.png", dummy)

    for src_path in src_files:
        file_name = ntpath.basename(src_path)
        org_img = cv2.imread(src_path, cv2.IMREAD_GRAYSCALE)
        cropped_img = helpers.prepare_cropped_sax_image(org_img, clahe=True, intermediate_crop=intermediate_crop, rotate=0)
        if SCALE_SIZE is not None:
            cropped_img = cv2.resize(cropped_img, (SCALE_SIZE, SCALE_SIZE), interpolation=cv2.INTER_AREA)

        cv2.imwrite(patient_img_dir + file_name, cropped_img)
        file_lst.append([file_name, "dummy_overlay.png"])

    with open(patient_img_dir + "pred.lst", "wb") as f:
        writer = csv.writer(f, delimiter='\t')
        writer.writerows(file_lst)
Example #2
0
def compute_volumes(patient_id, model_name, debug_info=False):
    patient_dir = helpers.get_pred_patient_dir(patient_id)
    min_areas = pandas.read_csv(patient_dir + "\\areas_" + model_name + ".csv", sep=";")
    columns = list(min_areas)
    # diastole_col = ""
    diastole_pixels = 0
    systole_pixels = 999999
    diastole_max = 0
    systole_max = 999999

    for column in columns:
        if not column.startswith("fr"):
            continue

        # if False:
        #     pixel_max = min_areas[column].max()
        #     if pixel_max > diastole_max:
        #         diastole_max = min_areas[column].max()
        #         diastole_col = column
        #
        #     pixel_max = min_areas[column].max()
        #     if pixel_max < systole_max:
        #         systole_max = pixel_max
        #         systole_col = column
        # else:

        value_list = min_areas[column].values.tolist()
        value_list.sort(reverse=True)
        pixel_sum = sum(value_list[:200])
        #pixel_sum = min_areas[column].sum()
        if pixel_sum > diastole_pixels:
            diastole_pixels = pixel_sum
            diastole_col = column

        if pixel_sum < systole_pixels:
            systole_pixels = pixel_sum
            systole_col = column

    if debug_info:
        current_debug_line.append(str(diastole_col))
        current_debug_line.append(str(systole_col))

    # min_areas["diastole_vol"] = min_areas[diastole_col] * min_areas["slice_dist"]
    # min_areas["systole_vol"] = min_areas[systole_col] * min_areas["slice_dist"]

    dist_col = "slice_dist"
    min_areas_selection = min_areas[["slice", "slice_thickness", "slice_location", "time", dist_col]].copy() # , "diastole_vol", "systole_vol"
    min_areas_selection["diastole"] = min_areas[diastole_col].values
    min_areas_selection["diastole_vol"] = (min_areas_selection["diastole"] * min_areas_selection[dist_col]).values
    min_areas_selection["diastole_conf"] = min_areas[diastole_col.replace("fr", "co")].values
    min_areas_selection["systole"] = min_areas[systole_col].values
    min_areas_selection["systole_vol"] = (min_areas_selection["systole"] * min_areas_selection[dist_col]).values
    min_areas_selection["systole_conf"] = min_areas[systole_col.replace("fr", "co")].values
    min_areas_selection.to_csv(patient_dir + "\\areas_dia_sys_" + model_name + ".csv", sep=";")

    dia_frame = diastole_col.replace("fr_", "")
    sys_frame = systole_col.replace("fr_", "")
    diastole_vol, dia_max_slice_val = compute_volumne_frustum(min_areas_selection["diastole"], min_areas_selection[dist_col])
    systole_vol, sys_max_slice_val = compute_volumne_frustum(min_areas_selection["systole"], min_areas_selection[dist_col])

    low_conf_diastole_vol = round(compute_volumne_frustum(min_areas_selection["diastole_conf"], min_areas_selection[dist_col])[0], 2)
    low_conf_systole_vol = round(compute_volumne_frustum(min_areas_selection["systole_conf"], min_areas_selection[dist_col])[0], 2)

    return diastole_vol, systole_vol, low_conf_diastole_vol, low_conf_systole_vol, dia_frame, sys_frame, dia_max_slice_val, sys_max_slice_val
Example #3
0
def count_pixels(patient_id, threshold, all_slice_data, model_name, threshold_value=-1):
    patient_slice_data = all_slice_data[all_slice_data["patient_id"] == patient_id].copy()
    patient_slice_data["slice_noloc"] = patient_slice_data["slice_no"].map(str) + "_" + patient_slice_data["slice_location"].map(str)
    slices = patient_slice_data["slice_noloc"].unique().tolist()
    frames = patient_slice_data["frame_no"].unique().tolist()
    frame_count = len(frames)

    # find lowest common set of frames that are present in every slice
    for name, records in patient_slice_data.groupby("slice_noloc"):
        slice_frames = records["frame_no"].unique()
        if (len(frames) / 2) >= len(slice_frames):
            # throw away small slices (416)
            print "Patient " + str(patient_id) + ": throw away slice : " + str(name)
            slices.remove(name)
            continue

        frames = list(set(frames) & set(slice_frames))

    new_frame_count = len(frames)
    if new_frame_count != frame_count:
        print "Patient " + str(patient_id) + ": frames not the same for every slice : " + str(frame_count) + " <> " + str(new_frame_count)

    file_name_slices = patient_slice_data.set_index('file_name')['slice_noloc'].to_dict()
    file_name_frames = patient_slice_data.set_index('file_name')['frame_no'].to_dict()
    # file_name_slice_locations = patient_slice_data.set_index('file_name')['frame_no'].to_dict()

    # set up matrix indexed by slice_no and frame_no
    slice_index = {}
    for slice_no in slices:
        slice_index[str(slice_no).rjust(2, '0')] = len(slice_index)

    frame_pixel_series = {}
    frame_confidence_series = {}
    for frame_no in frames:
        frame_pixel_series[str(frame_no).rjust(2, '0')] = [-1] * len(slices)
        frame_confidence_series[str(frame_no).rjust(2, '0')] = [-1] * len(slices)

    overlay_paths = helpers.get_patient_overlays(patient_id)
    for overlay_path in overlay_paths:
        overlay_img = cv2.imread(overlay_path, cv2.IMREAD_GRAYSCALE)

        low_confidence_pixel_count = ((overlay_img < LOW_CONFIDENCE_PIXEL_THRESHOLD) & (overlay_img > 20)).sum()
        # low_confidence_pixel_count = overlay_img[overlay_img > 10].mean()

        if threshold_value >= 0:
            overlay_img[overlay_img <= threshold_value] = 0
            overlay_img[overlay_img > threshold_value] = 255
        pixel_count = overlay_img.sum() / 255

        #if pixel_count < 1:
        #    low_confidence_pixel_percentage = -1

        #pixel_count = len(overlay_img[overlay_img > 0])

        file_name = get_filename(overlay_path)
        if file_name not in file_name_slices:
            continue
        slice_no = file_name_slices[file_name]
        frame_no = file_name_frames[file_name]

        slice_str = str(slice_no).rjust(2, '0')
        frame_str = str(frame_no).rjust(2, '0')
        if slice_str not in slice_index:
            print "Patient " + str(patient_id) + " : slice " + slice_str + " skipped"
            patient_slice_data = patient_slice_data[patient_slice_data["slice_noloc"] != slice_no]
            continue

        if frame_str not in frame_pixel_series:
            print "Patient " + str(patient_id) + " : frame " + frame_str + " skipped"
            patient_slice_data = patient_slice_data[patient_slice_data["frame_no"] != frame_no]
            continue

        frames_pixel_serie = frame_pixel_series[frame_str]
        frame_confidence_serie = frame_confidence_series[frame_str]
        serie_index = slice_index[slice_str]
        frames_pixel_serie[serie_index] = pixel_count
        frame_confidence_serie[serie_index] = low_confidence_pixel_count

    data_frame = pandas.DataFrame()
    patient_slice_data_frame1 = patient_slice_data[patient_slice_data["frame_no"] == 1]
    data_frame["slice"] = slices
    data_frame["slice_thickness"] = patient_slice_data_frame1["slice_thickness"].values
    data_frame["slice_location"] = patient_slice_data_frame1["slice_location"].values
    data_frame["slice_dist"] = (patient_slice_data_frame1["slice_location"].shift(-1) - patient_slice_data_frame1["slice_location"]).values
    data_frame["slice_dist"].fillna(data_frame["slice_dist"].mean(), inplace=True)
    data_frame["slice_location2a"] = patient_slice_data_frame1["slice_location2"].values
    data_frame["slice_location2b"] = patient_slice_data_frame1["slice_location2"].shift(-1).values
    data_frame["slice_dist2"] = data_frame.apply(lambda row: compute_distance(row["slice_location2a"], row["slice_location2b"]), axis=1)
    data_frame["slice_dist2"].fillna(data_frame["slice_dist2"].mean(), inplace=True)

    deltas = abs(abs(data_frame["slice_dist"]) - abs(data_frame["slice_dist2"])).sum()
    if deltas > 1:
        print "slice_dist != slice_dist2 (" + str(deltas) + ")"

    data_frame["time"] = patient_slice_data_frame1["time"].values
    for frame_no in frames:
        frame_str = str(frame_no).rjust(2, '0')
        interpolated_series = interpolate_series(frame_pixel_series[frame_str], frame_str)
        data_frame["fr_" + frame_str] = interpolated_series

    if SMOOTHEN_FRAMES:
        for frame_no in frames:
            prev_frame = frame_no - 1
            if prev_frame < 1:
                prev_frame = 30
            next_frame = frame_no + 1
            if next_frame > 30:
                next_frame = 1

            this_frame_col = "fr_" + str(frame_no).rjust(2, '0')
            next_frame_col = "fr_" + str(next_frame).rjust(2, '0')
            prev_frame_col = "fr_" + str(prev_frame).rjust(2, '0')

            if this_frame_col in data_frame.columns and next_frame_col in data_frame.columns and prev_frame_col in data_frame.columns:
                data_frame[this_frame_col] = (data_frame[this_frame_col] + data_frame[prev_frame_col] + data_frame[next_frame_col]) / 3

    for frame_no in frames:
        frame_str = str(frame_no).rjust(2, '0')
        data_frame["co_" + frame_str] = frame_confidence_series[frame_str]

    patient_dir = helpers.get_pred_patient_dir(patient_id)
    data_frame.to_csv(patient_dir + "\\areas_" + model_name + ".csv", sep=";")

    return data_frame