def show_means_compared(name_frame, name_scene, id_exbl, N=1000): """ Plots the visualisation of impact of the second stage of the algorithm on spectra, Fig.9 parameters: name_frame: name of the source image (inductive scenario) name_scene: name of the output image id_exbl: id of the reference spectrum N: no. vectors in the 2nd stage as int or percentage string e.g. '33p' """ data_frame, anno_frame = load_ds(name_frame, normalise=False) data_scene, anno_scene = load_ds(name_scene, normalise=False) blood_exbl = load_exbl(id_exbl) blood_frame = np.mean(data_frame[anno_frame == 1], axis=0) blood_scene = np.mean(data_scene[anno_scene == 1], axis=0) assert len(blood_exbl) == len(blood_frame) assert len(blood_exbl) == len(blood_scene) markers = ['s', 'v', '<', '>', '1', '.', 'p'] n_blood = np.count_nonzero(anno_scene == 1) N_v = decode_N(N, n_blood) wav = get_wavelengths() X_data = data_scene.reshape(-1, data_scene.shape[2]).copy() mf = TwoStageMatchedFilter() mf.fit(blood_exbl, X_data, N=N_v, N_supression=0) plt.rcParams.update({'font.size': 14}) plt.plot(wav, blood_scene, label="Image mean", marker=markers[0], markevery=0.3) plt.plot(wav, blood_exbl, label="Library", marker=markers[1], markevery=0.3) plt.plot(wav, mf.mf_2.mu_t, label='Second stage', marker=markers[2], markevery=0.3) plt.ylabel("Reflectance") plt.xlabel("Wavelenghts") plt.legend() plt.tight_layout() plt.show() plt.close()
def show_days(absorbance=True): """ plots blood spectra sorted by days (Fig.2) Parameters: --------------------- absorbance: transform reflectance into (pseudo)absorbance i.e. log(1/R) """ wav = get_wavelengths() days = ["Day 1(~1h)", "Day 1(~5h)", "Day 2", "Day 7"] frames = ["F(1)", "F(1s)", "F(2)", "F(7)"] plt.rcParams.update({'font.size': 14}) fig, ax = plt.subplots() markers = ['s', 'v', '<', '>', '1', '.', 'p'] for i_d, d in enumerate(days): data, anno = load_ds(frames[i_d], normalise=False) s = np.mean(data[anno == 1], axis=0) if absorbance: s[s == 0] += 0.0001 s = np.log10(1.0 / s) plt.plot(wav, s, label="{}".format(d), marker=markers[i_d], markevery=10) plt.legend() y0, y1 = ax.get_ylim() plt.xlim(400, 1000) if absorbance: plt.ylim(0.2, y1) plt.plot([542, 542], [0, y1], lw=0.5, linestyle='--', alpha=0.7, color='black') plt.annotate('542', xy=(542, y1), xytext=(525, y1), fontsize=10) plt.plot([577, 577], [0, y1], lw=0.5, linestyle='--', alpha=0.7, color='black') plt.annotate('577', xy=(577, y1), xytext=(560, y1), fontsize=10) if absorbance: plt.ylabel("Log(1/R)") else: plt.ylabel("Reflectance") plt.xlabel("Wavelenghts") plt.tight_layout() plt.show() plt.close()
def show_classes(name='F(1)', absorbance=False): """ plots spectra of classes in the image (Fig.1) Parameters: --------------------- name: image name absorbance: transform reflectance into (pseudo)absorbance i.e. log(1/R) """ data, anno = load_ds(name, normalise=False) wav = get_wavelengths() plt.rcParams.update({'font.size': 14}) plt.rcParams.update({'font.size': 12}) labels = [ 'blood', 'ketchup', 'artificial blood', 'beetroot juice', 'poster paint', 'tomato concentrate', 'acrylic paint' ] markers = ['s', 'v', '<', '>', '1', '.', 'p'] cmap = plt.get_cmap("Set1") colors = [cmap(i / 7) for i in range(8)] colors[-4] = cmap(1.0) for c_label in range(1, 8): if c_label in anno: al = 1.0 if c_label == 1 else 0.7 pattern = data[anno == c_label] s = np.median(pattern, axis=0) if absorbance: s[s == 0] += 0.0001 s = np.log10(1.0 / s) plt.plot(wav, s, label="{} ({})".format(labels[c_label - 1], c_label), color=colors[c_label - 1], alpha=al, marker=markers[c_label - 1], markevery=10) plt.legend() if absorbance: plt.ylabel("Log(1/R)") else: plt.ylabel("Reflectance") plt.xlabel("Wavelenghts") plt.tight_layout(pad=0) plt.show() plt.close()
def save_gt(data, anno_in, code): """ saves rgb with class annotation fig.6-8 Parameters: --------------------- data: data cube as nparray annotation: 2d annotation array """ ax = plt.subplot() colors = [] #listerd colormap for i in [0, 6, 1, 2, 3, 4, 5, 10, 7, 8]: colors.append(plt.get_cmap('tab20')(i / 20)) cmap = ListedColormap(colors, name='colors', N=len(colors)) anno = anno_in.copy() anno[anno == 15] = 0 rgb = hsi2rgb(data, wavelengths=get_wavelengths(), gamma=0.7) plt.imshow(rgb, aspect='auto') X, y, pos = data2xy(data, anno) for u in np.unique(y)[::-1]: if u != 0: where = y == u pw = pos[where] r = [t[0] for t in pw] c = [t[1] for t in pw] sc = plt.scatter(x=c, y=r, marker=',', s=3, lw=1, alpha=0.8, color=cmap(u)) ax.set_axis_off() ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) plt.tight_layout(pad=0) plt.savefig('res/res_{}.png'.format(code), bbox_inches='tight', pad_inches=0) plt.close()
def show_mixtures(absorbance=True): """ plots differences of blood spectra on different backgrounds (Fig.2) Parameters: --------------------- absorbance: transform reflectance into (pseudo)absorbance i.e. log(1/R) """ wav = get_wavelengths() data, gt = load_ds('E(1)', normalise=False) #lower range and material backgrounds = [[44, 'metal'], [74, 'plastic'], [147, 'wood'], [192, 'blue'], [271, 'red(t-shirt)'], [332, 'mixed'], [430, 'mixed(green)'], [516, 'red(sweater)']] plt.rcParams.update({'font.size': 14}) where = gt != 1 gt[where] = 0 markers = ['s', 'v', '<', '>', '1', '.', 'p', 'x'] for i_b, b in enumerate(backgrounds): gta = gt.copy() gta[b[0]:, :] = 0 if i_b != 0: gta[:backgrounds[i_b - 1][0]:, :] = 0 X = data[gta == 1, :] print(b, X.shape) s = np.median(X, axis=0) if absorbance: s[s == 0] += 0.0001 s = np.log10(1.0 / s) plt.plot(wav, s, label="{}".format(b[1]), marker=markers[i_b], markevery=10) plt.legend() if absorbance: plt.ylabel("Log(1/R)") else: plt.ylabel("Reflectance") plt.xlabel("Wavelenghts") plt.show() plt.close()